/ Hex Artifact Content
Login

Artifact 374f50ced988b23addabd3c351f1c18d8652d394:


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 20 20 57 68 65  ereLoop */.  Whe
3120: 72 65 4c 6f 6f 70 20 2a 70 42 65 73 74 3b 20 20  reLoop *pBest;  
3130: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
3140: 2d 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 73 69 6e  -NULL, store sin
3150: 67 6c 65 20 62 65 73 74 20 6c 6f 6f 70 20 68 65  gle best loop he
3160: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 54 65  re */.  int mxTe
3170: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
3180: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
3190: 62 65 72 20 6f 66 20 61 54 65 72 6d 5b 5d 20 65  ber of aTerm[] e
31a0: 6e 74 72 69 65 73 20 6f 6e 20 70 4e 65 77 20 2a  ntries on pNew *
31b0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d  /.};../*.** Bitm
31c0: 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65  asks for the ope
31d0: 72 61 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69  rators that indi
31e0: 63 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20  ces are able to 
31f0: 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20  exploit.  An.** 
3200: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR-ed combinatio
3210: 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65  n of these value
3220: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  s can be used wh
3230: 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  en searching for
3240: 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65  .** terms in the
3250: 20 77 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a   where clause..*
3260: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20  /.#define WO_IN 
3270: 20 20 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e      0x001.#defin
3280: 65 20 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30  e WO_EQ     0x00
3290: 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20  2.#define WO_LT 
32a0: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
32b0: 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LT-TK_EQ)).#defi
32c0: 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f  ne WO_LE     (WO
32d0: 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45  _EQ<<(TK_LE-TK_E
32e0: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
32f0: 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  T     (WO_EQ<<(T
3300: 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GT-TK_EQ)).#de
3310: 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28  fine WO_GE     (
3320: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b  WO_EQ<<(TK_GE-TK
3330: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
3340: 5f 4d 41 54 43 48 20 20 30 78 30 34 30 0a 23 64  _MATCH  0x040.#d
3350: 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20  efine WO_ISNULL 
3360: 30 78 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f  0x080.#define WO
3370: 5f 4f 52 20 20 20 20 20 30 78 31 30 30 20 20 20  _OR     0x100   
3380: 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f      /* Two or mo
3390: 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  re OR-connected 
33a0: 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65  terms */.#define
33b0: 20 57 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30   WO_AND    0x200
33c0: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
33d0: 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63   more AND-connec
33e0: 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65  ted terms */.#de
33f0: 66 69 6e 65 20 57 4f 5f 45 51 55 49 56 20 20 30  fine WO_EQUIV  0
3400: 78 34 30 30 20 20 20 20 20 20 20 2f 2a 20 4f 66  x400       /* Of
3410: 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d 42 2c 20   the form A==B, 
3420: 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  both columns */.
3430: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
3440: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
3450: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
3460: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
3470: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
3480: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
3490: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
34a0: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
34b0: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
34c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
34d0: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
34e0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
34f0: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
3500: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
3510: 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46  ** Value for wsF
3520: 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
3530: 20 62 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64   bestIndex() and
3540: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68   stored in.** Wh
3550: 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73  ereLevel.wsFlags
3560: 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 64  .  These flags d
3570: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73  etermine which s
3580: 65 61 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67  earch.** strateg
3590: 69 65 73 20 61 72 65 20 61 70 70 72 6f 70 72 69  ies are appropri
35a0: 61 74 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ate..*/.#define 
35b0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 20  WHERE_ROWID_EQ  
35c0: 20 20 20 30 78 30 30 30 30 30 30 30 31 20 20 2f     0x00000001  /
35d0: 2a 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20  * rowid=EXPR or 
35e0: 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 2a  rowid IN (...) *
35f0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
3600: 52 4f 57 49 44 5f 52 41 4e 47 45 20 20 30 78 30  ROWID_RANGE  0x0
3610: 30 30 30 30 30 30 32 20 20 2f 2a 20 72 6f 77 69  0000002  /* rowi
3620: 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 72 6f  d<EXPR and/or ro
3630: 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66  wid>EXPR */.#def
3640: 69 6e 65 20 57 48 45 52 45 5f 4e 55 4c 4c 5f 4f  ine WHERE_NULL_O
3650: 4b 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30  K      0x0000000
3660: 34 20 20 2f 2a 20 4f 6b 20 74 6f 20 75 73 65 20  4  /* Ok to use 
3670: 57 4f 5f 49 53 4e 55 4c 4c 20 2a 2f 0a 23 64 65  WO_ISNULL */.#de
3680: 66 69 6e 65 20 57 48 45 52 45 5f 49 50 4b 20 20  fine WHERE_IPK  
3690: 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30          0x000000
36a0: 30 38 20 20 2f 2a 20 78 20 69 73 20 74 68 65 20  08  /* x is the 
36b0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
36c0: 4b 45 59 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  KEY */.#define W
36d0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20  HERE_COLUMN_EQ  
36e0: 20 20 30 78 30 30 30 30 30 30 31 30 20 20 2f 2a    0x00000010  /*
36f0: 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e 20   x=EXPR or x IN 
3700: 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e 55  (...) or x IS NU
3710: 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  LL */.#define WH
3720: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
3730: 20 30 78 30 30 30 30 30 30 32 30 20 20 2f 2a 20   0x00000020  /* 
3740: 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e  x<EXPR and/or x>
3750: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
3760: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20  WHERE_COLUMN_IN 
3770: 20 20 20 30 78 30 30 30 30 30 30 34 30 20 20 2f     0x00000040  /
3780: 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a  * x IN (...) */.
3790: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
37a0: 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30 30  LUMN_NULL  0x000
37b0: 30 30 30 38 30 20 20 2f 2a 20 78 20 49 53 20 4e  00080  /* x IS N
37c0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
37d0: 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20  HERE_INDEXED    
37e0: 20 20 30 78 30 30 30 30 30 30 66 30 20 20 2f 2a    0x000000f0  /*
37f0: 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20 75   Anything that u
3800: 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a  ses an index */.
3810: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e 4f  #define WHERE_NO
3820: 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 30 30 30  T_FULLSCAN 0x000
3830: 32 30 30 66 33 20 20 2f 2a 20 44 6f 65 73 20 6e  200f3  /* Does n
3840: 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61 62  ot do a full tab
3850: 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66 69  le scan */.#defi
3860: 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45  ne WHERE_IN_ABLE
3870: 20 20 20 20 20 20 30 78 30 30 30 31 30 30 66 31        0x000100f1
3880: 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75 70    /* Able to sup
3890: 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72 61  port an IN opera
38a0: 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  tor */.#define W
38b0: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20  HERE_TOP_LIMIT  
38c0: 20 20 30 78 30 30 30 30 30 31 30 30 20 20 2f 2a    0x00000100  /*
38d0: 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58   x<EXPR or x<=EX
38e0: 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  PR constraint */
38f0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42  .#define WHERE_B
3900: 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30  TM_LIMIT    0x00
3910: 30 30 30 32 30 30 20 20 2f 2a 20 78 3e 45 58 50  000200  /* x>EXP
3920: 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e  R or x>=EXPR con
3930: 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69  straint */.#defi
3940: 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  ne WHERE_BOTH_LI
3950: 4d 49 54 20 20 20 30 78 30 30 30 30 30 33 30 30  MIT   0x00000300
3960: 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50 52    /* Both x>EXPR
3970: 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a 23   and x<EXPR */.#
3980: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58  define WHERE_IDX
3990: 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 30 30  _ONLY     0x0000
39a0: 30 34 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64  0400  /* Use ind
39b0: 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74  ex only - omit t
39c0: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
39d0: 57 48 45 52 45 5f 4f 52 44 45 52 45 44 20 20 20  WHERE_ORDERED   
39e0: 20 20 20 30 78 30 30 30 30 30 38 30 30 20 20 2f     0x00000800  /
39f0: 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70  * Output will ap
3a00: 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20  pear in correct 
3a10: 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65  order */.#define
3a20: 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20 20   WHERE_REVERSE  
3a30: 20 20 20 20 30 78 30 30 30 30 31 30 30 30 20 20      0x00001000  
3a40: 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72  /* Scan in rever
3a50: 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66  se order */.#def
3a60: 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45  ine WHERE_UNIQUE
3a70: 20 20 20 20 20 20 20 30 78 30 30 30 30 32 30 30         0x0000200
3a80: 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f  0  /* Selects no
3a90: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
3aa0: 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  ow */.#define WH
3ab0: 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20 20  ERE_ALL_UNIQUE  
3ac0: 20 30 78 30 30 30 30 34 30 30 30 20 20 2f 2a 20   0x00004000  /* 
3ad0: 54 68 69 73 20 61 6e 64 20 61 6c 6c 20 70 72 69  This and all pri
3ae0: 6f 72 20 68 61 76 65 20 6f 6e 65 20 72 6f 77 20  or have one row 
3af0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
3b00: 5f 4f 42 5f 55 4e 49 51 55 45 20 20 20 20 30 78  _OB_UNIQUE    0x
3b10: 30 30 30 30 38 30 30 30 20 20 2f 2a 20 56 61 6c  00008000  /* Val
3b20: 75 65 73 20 69 6e 20 4f 52 44 45 52 20 42 59 20  ues in ORDER BY 
3b30: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 0a 20 20 20  columns are .   
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74      ** different
3b70: 20 66 6f 72 20 65 76 65 72 79 20 6f 75 74 70 75   for every outpu
3b80: 74 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65  t row */.#define
3b90: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
3ba0: 42 4c 45 20 30 78 30 30 30 31 30 30 30 30 20 20  BLE 0x00010000  
3bb0: 2f 2a 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74  /* Use virtual-t
3bc0: 61 62 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20  able processing 
3bd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
3be0: 5f 4d 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78  _MULTI_OR     0x
3bf0: 30 30 30 32 30 30 30 30 20 20 2f 2a 20 4f 52 20  00020000  /* OR 
3c00: 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69  using multiple i
3c10: 6e 64 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e  ndices */.#defin
3c20: 65 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  e WHERE_TEMP_IND
3c30: 45 58 20 20 20 30 78 30 30 30 34 30 30 30 30 20  EX   0x00040000 
3c40: 20 2f 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65   /* Uses an ephe
3c50: 6d 65 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 23  meral index */.#
3c60: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 44 49 53  define WHERE_DIS
3c70: 54 49 4e 43 54 20 20 20 20 20 30 78 30 30 30 38  TINCT     0x0008
3c80: 30 30 30 30 20 20 2f 2a 20 43 6f 72 72 65 63 74  0000  /* Correct
3c90: 20 6f 72 64 65 72 20 66 6f 72 20 44 49 53 54 49   order for DISTI
3ca0: 4e 43 54 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  NCT */.#define W
3cb0: 48 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 20  HERE_COVER_SCAN 
3cc0: 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f 2a    0x00100000  /*
3cd0: 20 46 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 20   Full scan of a 
3ce0: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a  covering index *
3cf0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
3d00: 53 49 4e 47 4c 45 5f 52 4f 57 20 20 20 30 78 30  SINGLE_ROW   0x0
3d10: 30 32 30 30 30 30 30 20 20 2f 2a 20 4e 6f 20 6d  0200000  /* No m
3d20: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
3d30: 20 67 75 61 72 61 6e 74 65 65 64 20 2a 2f 0a 0a   guaranteed */..
3d40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c  /*.** This modul
3d50: 65 20 63 6f 6e 74 61 69 6e 73 20 6d 61 6e 79 20  e contains many 
3d60: 73 65 70 61 72 61 74 65 20 73 75 62 72 6f 75 74  separate subrout
3d70: 69 6e 65 73 20 74 68 61 74 20 77 6f 72 6b 20 74  ines that work t
3d80: 6f 67 65 74 68 65 72 20 74 6f 0a 2a 2a 20 66 69  ogether to.** fi
3d90: 6e 64 20 74 68 65 20 62 65 73 74 20 69 6e 64 69  nd the best indi
3da0: 63 65 73 20 74 6f 20 75 73 65 20 66 6f 72 20 61  ces to use for a
3db0: 63 63 65 73 73 69 6e 67 20 61 20 70 61 72 74 69  ccessing a parti
3dc0: 63 75 6c 61 72 20 74 61 62 6c 65 20 69 6e 20 61  cular table in a
3dd0: 20 71 75 65 72 79 2e 0a 2a 2a 20 41 6e 20 69 6e   query..** An in
3de0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3df0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3e00: 65 20 68 6f 6c 64 73 20 63 6f 6e 74 65 78 74 20  e holds context 
3e10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
3e20: 74 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 73  t the.** index s
3e30: 65 61 72 63 68 20 73 6f 20 74 68 61 74 20 69 74  earch so that it
3e40: 20 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 61 73   can be more eas
3e50: 69 6c 79 20 70 61 73 73 65 64 20 62 65 74 77 65  ily passed betwe
3e60: 65 6e 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a  en the various.*
3e70: 2a 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 74  * routines..*/.t
3e80: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
3e90: 65 72 65 42 65 73 74 49 64 78 20 57 68 65 72 65  ereBestIdx Where
3ea0: 42 65 73 74 49 64 78 3b 0a 73 74 72 75 63 74 20  BestIdx;.struct 
3eb0: 57 68 65 72 65 42 65 73 74 49 64 78 20 7b 0a 20  WhereBestIdx {. 
3ec0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
3ef0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
3f00: 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
3f10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
3f20: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
3f30: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3f40: 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 20 20  item *pSrc;     
3f50: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
3f60: 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
3f70: 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
3f80: 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
3f90: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
3fa0: 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61  of cursors not a
3fb0: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 42 69  vailable */.  Bi
3fc0: 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 3b 20  tmask notValid; 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3fe0: 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61   Cursors not ava
3ff0: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70  ilable for any p
4000: 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72  urpose */.  Expr
4010: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
4020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4030: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
4040: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
4050: 20 2a 70 44 69 73 74 69 6e 63 74 3b 20 20 20 20   *pDistinct;    
4060: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
4070: 65 6c 65 63 74 2d 6c 69 73 74 20 69 66 20 71 75  elect-list if qu
4080: 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
4090: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  */.  sqlite3_ind
40a0: 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49  ex_info **ppIdxI
40b0: 6e 66 6f 3b 20 2f 2a 20 49 6e 64 65 78 20 69 6e  nfo; /* Index in
40c0: 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
40d0: 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a   to xBestIndex *
40e0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 20 20 20  /.  int i, n;   
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 6f 6f      /* Which loo
4110: 70 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  p is being coded
4120: 3b 20 23 20 6f 66 20 6c 6f 6f 70 73 20 2a 2f 0a  ; # of loops */.
4130: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 61 4c    WhereLevel *aL
4140: 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  evel;           
4150: 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20    /* Info about 
4160: 6f 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20  outer loops */. 
4170: 20 57 68 65 72 65 43 6f 73 74 20 63 6f 73 74 3b   WhereCost cost;
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4190: 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
41a0: 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 7d 3b  query plan */.};
41b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
41c0: 52 55 45 20 69 66 20 74 68 65 20 70 72 6f 62 65  RUE if the probe
41d0: 20 63 6f 73 74 20 69 73 20 6c 65 73 73 20 74 68   cost is less th
41e0: 61 6e 20 74 68 65 20 62 61 73 65 6c 69 6e 65 20  an the baseline 
41f0: 63 6f 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cost.*/.static i
4200: 6e 74 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 63  nt compareCost(c
4210: 6f 6e 73 74 20 57 68 65 72 65 43 6f 73 74 20 2a  onst WhereCost *
4220: 70 50 72 6f 62 65 2c 20 63 6f 6e 73 74 20 57 68  pProbe, const Wh
4230: 65 72 65 43 6f 73 74 20 2a 70 42 61 73 65 6c 69  ereCost *pBaseli
4240: 6e 65 29 7b 0a 20 20 69 66 28 20 70 50 72 6f 62  ne){.  if( pProb
4250: 65 2d 3e 72 43 6f 73 74 3c 70 42 61 73 65 6c 69  e->rCost<pBaseli
4260: 6e 65 2d 3e 72 43 6f 73 74 20 29 20 72 65 74 75  ne->rCost ) retu
4270: 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 50 72 6f  rn 1;.  if( pPro
4280: 62 65 2d 3e 72 43 6f 73 74 3e 70 42 61 73 65 6c  be->rCost>pBasel
4290: 69 6e 65 2d 3e 72 43 6f 73 74 20 29 20 72 65 74  ine->rCost ) ret
42a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 50 72  urn 0;.  if( pPr
42b0: 6f 62 65 2d 3e 70 6c 61 6e 2e 6e 4f 42 53 61 74  obe->plan.nOBSat
42c0: 3e 70 42 61 73 65 6c 69 6e 65 2d 3e 70 6c 61 6e  >pBaseline->plan
42d0: 2e 6e 4f 42 53 61 74 20 29 20 72 65 74 75 72 6e  .nOBSat ) return
42e0: 20 31 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65   1;.  if( pProbe
42f0: 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3c 70 42 61 73  ->plan.nRow<pBas
4300: 65 6c 69 6e 65 2d 3e 70 6c 61 6e 2e 6e 52 6f 77  eline->plan.nRow
4310: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
4320: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4330: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70  * Initialize a p
4340: 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  reallocated Wher
4350: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
4360: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
4370: 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69  d whereClauseIni
4380: 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  t(.  WhereClause
4390: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a   *pWC,        /*
43a0: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
43b0: 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   to be initializ
43c0: 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  ed */.  Parse *p
43d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
43e0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
43f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
4400: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
4410: 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e 67  Set,  /* Mapping
4420: 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73   from table curs
4430: 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69  or numbers to bi
4440: 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 75 31 36 20  tmasks */.  u16 
4450: 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20  wctrlFlags      
4460: 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 69 6e       /* Might in
4470: 63 6c 75 64 65 20 57 48 45 52 45 5f 41 4e 44 5f  clude WHERE_AND_
4480: 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 70 57 43  ONLY */.){.  pWC
4490: 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
44a0: 65 3b 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b 53  e;.  pWC->pMaskS
44b0: 65 74 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a 20  et = pMaskSet;. 
44c0: 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30   pWC->pOuter = 0
44d0: 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d  ;.  pWC->nTerm =
44e0: 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74   0;.  pWC->nSlot
44f0: 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57 43   = ArraySize(pWC
4500: 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57  ->aStatic);.  pW
4510: 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61  C->a = pWC->aSta
4520: 74 69 63 3b 0a 20 20 70 57 43 2d 3e 77 63 74 72  tic;.  pWC->wctr
4530: 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
4540: 61 67 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  ags;.}../* Forwa
4550: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
4560: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
4570: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65  eClauseClear(Whe
4580: 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a  reClause*);../*.
4590: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
45a0: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
45b0: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
45c0: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  OrInfo object..*
45d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
45e0: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
45f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
4600: 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  reOrInfo *p){.  
4610: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
4620: 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69  (&p->wc);.  sqli
4630: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
4640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
4650: 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  ocate all memory
4660: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4670: 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20   a WhereAndInfo 
4680: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
4690: 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49  c void whereAndI
46a0: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
46b0: 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49  3 *db, WhereAndI
46c0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  nfo *p){.  where
46d0: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e  ClauseClear(&p->
46e0: 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  wc);.  sqlite3Db
46f0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
4700: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
4710: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73   a WhereClause s
4720: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 57  tructure.  The W
4730: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
4740: 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69  ture.** itself i
4750: 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68  s not freed.  Th
4760: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
4770: 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65  e inverse of whe
4780: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a  reClauseInit()..
4790: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
47a0: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
47b0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
47c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
47d0: 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71  ereTerm *a;.  sq
47e0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d  lite3 *db = pWC-
47f0: 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66  >pParse->db;.  f
4800: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
4810: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d  1, a=pWC->a; i>=
4820: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20  0; i--, a++){.  
4830: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
4840: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
4850: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4860: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61  ExprDelete(db, a
4870: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
4880: 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61      if( a->wtFla
4890: 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
48a0: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f   ){.      whereO
48b0: 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20  rInfoDelete(db, 
48c0: 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20  a->u.pOrInfo);. 
48d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e     }else if( a->
48e0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41  wtFlags & TERM_A
48f0: 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20  NDINFO ){.      
4900: 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65  whereAndInfoDele
4910: 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64  te(db, a->u.pAnd
4920: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Info);.    }.  }
4930: 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70  .  if( pWC->a!=p
4940: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
4950: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4960: 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20  (db, pWC->a);.  
4970: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
4980: 20 73 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72   single new Wher
4990: 65 54 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74  eTerm entry to t
49a0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
49b0: 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68  bject pWC..** Th
49c0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
49d0: 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72  object is constr
49e0: 75 63 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20  ucted from Expr 
49f0: 70 20 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61  p and with wtFla
4a00: 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  gs..** The index
4a10: 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20   in pWC->a[] of 
4a20: 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  the new WhereTer
4a30: 6d 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  m is returned on
4a40: 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69   success..** 0 i
4a50: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
4a60: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
4a70: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64  could not be add
4a80: 65 64 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f  ed due to a memo
4a90: 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ry.** allocation
4aa0: 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d   error.  The mem
4ab0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
4ac0: 61 69 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72  ailure will be r
4ad0: 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68  ecorded in.** th
4ae0: 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
4af0: 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20  ed flag so that 
4b00: 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e  higher-level fun
4b10: 63 74 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63  ctions can detec
4b20: 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t it..**.** This
4b30: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e   routine will in
4b40: 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
4b50: 6f 66 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  of the pWC->a[] 
4b60: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
4b70: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ry..**.** If the
4b80: 20 77 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e   wtFlags argumen
4b90: 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f  t includes TERM_
4ba0: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65  DYNAMIC, then re
4bb0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
4bc0: 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
4bd0: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20  expression p is 
4be0: 61 73 73 75 6d 65 64 20 62 79 20 74 68 65 20 57  assumed by the W
4bf0: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
4c00: 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69  t pWC..** This i
4c10: 73 20 74 72 75 65 20 65 76 65 6e 20 69 66 20 74  s true even if t
4c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
4c30: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  s to allocate a 
4c40: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  new WhereTerm..*
4c50: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54  *.** WARNING:  T
4c60: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
4c70: 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65  t reallocate the
4c80: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 73   space used to s
4c90: 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72  tore.** WhereTer
4ca0: 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72  ms.  All pointer
4cb0: 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20  s to WhereTerms 
4cc0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69  should be invali
4cd0: 64 61 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63  dated after.** c
4ce0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
4cf0: 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74  ine.  Such point
4d00: 65 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69  ers may be reini
4d10: 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65  tialized by refe
4d20: 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70  rencing.** the p
4d30: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a  WC->a[] array..*
4d40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
4d50: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57  reClauseInsert(W
4d60: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
4d70: 20 45 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46   Expr *p, u8 wtF
4d80: 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65  lags){.  WhereTe
4d90: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
4da0: 20 69 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65   idx;.  testcase
4db0: 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ( wtFlags & TERM
4dc0: 5f 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20  _VIRTUAL );  /* 
4dd0: 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30  EV: R-00211-1510
4de0: 30 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e  0 */.  if( pWC->
4df0: 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f  nTerm>=pWC->nSlo
4e00: 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  t ){.    WhereTe
4e10: 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e  rm *pOld = pWC->
4e20: 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  a;.    sqlite3 *
4e30: 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  db = pWC->pParse
4e40: 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61  ->db;.    pWC->a
4e50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
4e60: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
4e70: 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d  (pWC->a[0])*pWC-
4e80: 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20  >nSlot*2 );.    
4e90: 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b  if( pWC->a==0 ){
4ea0: 0a 20 20 20 20 20 20 69 66 28 20 77 74 46 6c 61  .      if( wtFla
4eb0: 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49  gs & TERM_DYNAMI
4ec0: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
4ed0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4ee0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, p);.      }. 
4ef0: 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f       pWC->a = pO
4f00: 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ld;.      return
4f10: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65   0;.    }.    me
4f20: 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c  mcpy(pWC->a, pOl
4f30: 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  d, sizeof(pWC->a
4f40: 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29  [0])*pWC->nTerm)
4f50: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d  ;.    if( pOld!=
4f60: 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a  pWC->aStatic ){.
4f70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4f80: 72 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20  ree(db, pOld);. 
4f90: 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53     }.    pWC->nS
4fa0: 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  lot = sqlite3DbM
4fb0: 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57  allocSize(db, pW
4fc0: 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43  C->a)/sizeof(pWC
4fd0: 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70  ->a[0]);.  }.  p
4fe0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
4ff0: 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b  dx = pWC->nTerm+
5000: 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78  +];.  pTerm->pEx
5010: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
5020: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a  SkipCollate(p);.
5030: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
5040: 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54   = wtFlags;.  pT
5050: 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  erm->pWC = pWC;.
5060: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
5070: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
5080: 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  idx;.}../*.** Th
5090: 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74  is routine ident
50a0: 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73 73  ifies subexpress
50b0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
50c0: 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a  E clause where.*
50d0: 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  * each subexpres
50e0: 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
50f0: 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65  d by the AND ope
5100: 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74  rator or some ot
5110: 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  her.** operator 
5120: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
5130: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20   op parameter.  
5140: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
5150: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20  structure.** is 
5160: 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e  filled with poin
5170: 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72 65  ters to subexpre
5180: 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61  ssions.  For exa
5190: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57  mple:.**.**    W
51a0: 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27  HERE  a=='hello'
51b0: 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c   AND coalesce(b,
51c0: 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32  11)<10 AND (c+12
51d0: 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a  !=d OR c==22).**
51e0: 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
51f0: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
5200: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
5210: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
5220: 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
5230: 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20   slot[0]        
5240: 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20      slot[1]     
5250: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32            slot[2
5260: 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ].**.** The orig
5270: 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  inal WHERE claus
5280: 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e  e in pExpr is un
5290: 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68  altered.  All th
52a0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f  is routine.** do
52b0: 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b  es is make slot[
52c0: 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20  ] entries point 
52d0: 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65 20  to substructure 
52e0: 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a  within pExpr..**
52f0: 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69  .** In the previ
5300: 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64  ous sentence and
5310: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c   in the diagram,
5320: 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73   "slot[]" refers
5330: 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65   to.** the Where
5340: 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79  Clause.a[] array
5350: 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72  .  The slot[] ar
5360: 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65  ray grows as nee
5370: 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a  ded to contain.*
5380: 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * all terms of t
5390: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
53a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
53b0: 77 68 65 72 65 53 70 6c 69 74 28 57 68 65 72 65  whereSplit(Where
53c0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
53d0: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70  r *pExpr, int op
53e0: 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 28  ){.  pWC->op = (
53f0: 75 38 29 6f 70 3b 0a 20 20 69 66 28 20 70 45 78  u8)op;.  if( pEx
5400: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
5410: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
5420: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
5430: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
5440: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
5450: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
5460: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
5470: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
5480: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
5490: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
54a0: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
54b0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20  * Initialize an 
54c0: 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
54d0: 73 65 74 20 28 61 20 57 68 65 72 65 4d 61 73 6b  set (a WhereMask
54e0: 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a 2f 0a 23  Set object).*/.#
54f0: 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53  define initMaskS
5500: 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c  et(P)  memset(P,
5510: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a   0, sizeof(*P)).
5520: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5530: 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68  e bitmask for th
5540: 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e  e given cursor n
5550: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30  umber.  Return 0
5560: 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69   if.** iCursor i
5570: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74  s not in the set
5580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
5590: 61 73 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72  ask getMask(Wher
55a0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
55b0: 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29  et, int iCursor)
55c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
55d0: 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e  ert( pMaskSet->n
55e0: 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69  <=(int)sizeof(Bi
55f0: 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f  tmask)*8 );.  fo
5600: 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65  r(i=0; i<pMaskSe
5610: 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t->n; i++){.    
5620: 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  if( pMaskSet->ix
5630: 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  [i]==iCursor ){.
5640: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 42        return ((B
5650: 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20  itmask)1)<<i;.  
5660: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5670: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
5680: 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66  ate a new mask f
5690: 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f  or cursor iCurso
56a0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  r..**.** There i
56b0: 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72  s one cursor per
56c0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
56d0: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
56e0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62  number of.** tab
56f0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
5700: 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
5710: 64 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c  d by a test earl
5720: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  y in the.** sqli
5730: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
5740: 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20  routine.  So we 
5750: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d  know that the pM
5760: 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20  askSet->ix[].** 
5770: 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72  array will never
5780: 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74   overflow..*/.st
5790: 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65  atic void create
57a0: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
57b0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
57c0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73   iCursor){.  ass
57d0: 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e  ert( pMaskSet->n
57e0: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61   < ArraySize(pMa
57f0: 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20  skSet->ix) );.  
5800: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61  pMaskSet->ix[pMa
5810: 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43  skSet->n++] = iC
5820: 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ursor;.}../*.** 
5830: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c  This routine wal
5840: 6b 73 20 28 72 65 63 75 72 73 69 76 65 6c 79 29  ks (recursively)
5850: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
5860: 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65  ree and generate
5870: 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69  s.** a bitmask i
5880: 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20  ndicating which 
5890: 74 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  tables are used 
58a0: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
58b0: 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a  on.** tree..**.*
58c0: 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  * In order for t
58d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77  his routine to w
58e0: 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ork, the calling
58f0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68   function must h
5900: 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  ave.** previousl
5910: 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65  y invoked sqlite
5920: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
5930: 73 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65  s() on the expre
5940: 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74  ssion.  See.** t
5950: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
5960: 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e  t on that routin
5970: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
5980: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
5990: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f   The sqlite3Reso
59a0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72  lveExprNames() r
59b0: 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f  outines looks fo
59c0: 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  r column names a
59d0: 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72  nd.** sets their
59e0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43   opcodes to TK_C
59f0: 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20  OLUMN and their 
5a00: 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c  Expr.iTable fiel
5a10: 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42  ds to.** the VDB
5a20: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
5a30: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
5a40: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
5a50: 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73   has to.** trans
5a60: 6c 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20  late the cursor 
5a70: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
5a80: 6d 61 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20  mask values and 
5a90: 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69  OR all.** the bi
5aa0: 74 6d 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e  tmasks together.
5ab0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
5ac0: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
5ad0: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
5ae0: 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b  et*, ExprList*);
5af0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
5b00: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
5b10: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
5b20: 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74  t*, Select*);.st
5b30: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
5b40: 72 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  rTableUsage(Wher
5b50: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
5b60: 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  et, Expr *p){.  
5b70: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
5b80: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
5b90: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
5ba0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
5bb0: 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65  ){.    mask = ge
5bc0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
5bd0: 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  p->iTable);.    
5be0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d  return mask;.  }
5bf0: 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61  .  mask = exprTa
5c00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
5c10: 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  t, p->pRight);. 
5c20: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
5c30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
5c40: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  , p->pLeft);.  i
5c50: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
5c60: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
5c70: 63 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20  ct) ){.    mask 
5c80: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
5c90: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
5ca0: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
5cb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61  .  }else{.    ma
5cc0: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
5cd0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
5ce0: 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  t, p->x.pList);.
5cf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
5d00: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
5d10: 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c  ask exprListTabl
5d20: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
5d30: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
5d40: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
5d50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d  .  int i;.  Bitm
5d60: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
5d70: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
5d80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
5d90: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
5da0: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78        mask |= ex
5db0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
5dc0: 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  skSet, pList->a[
5dd0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  i].pExpr);.    }
5de0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61  .  }.  return ma
5df0: 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74  sk;.}.static Bit
5e00: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
5e10: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
5e20: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
5e30: 2c 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20  , Select *pS){. 
5e40: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
5e50: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29  0;.  while( pS )
5e60: 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
5e70: 53 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  Src = pS->pSrc;.
5e80: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
5e90: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
5ea0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c  MaskSet, pS->pEL
5eb0: 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ist);.    mask |
5ec0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
5ed0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
5ee0: 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  S->pGroupBy);.  
5ef0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
5f00: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
5f10: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65  skSet, pS->pOrde
5f20: 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  rBy);.    mask |
5f30: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
5f40: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
5f50: 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b  Where);.    mask
5f60: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
5f70: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
5f80: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69  >pHaving);.    i
5f90: 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d  f( ALWAYS(pSrc!=
5fa0: 30 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0) ){.      int 
5fb0: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
5fc0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
5fd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  i++){.        ma
5fe0: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
5ff0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
6000: 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  Set, pSrc->a[i].
6010: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
6020: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
6030: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
6040: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f  t, pSrc->a[i].pO
6050: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
6060: 7d 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70  }.    pS = pS->p
6070: 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74  Prior;.  }.  ret
6080: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a  urn mask;.}../*.
6090: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
60a0: 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72  f the given oper
60b0: 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74  ator is one of t
60c0: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
60d0: 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20  t is.** allowed 
60e0: 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65  for an indexable
60f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
6100: 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64  rm.  The allowed
6110: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a   operators are.*
6120: 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c  * "=", "<", ">",
6130: 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64   "<=", ">=", and
6140: 20 22 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50   "IN"..**.** IMP
6150: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
6160: 52 2d 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f  R-59926-26393 To
6170: 20 62 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e   be usable by an
6180: 20 69 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75   index a term mu
6190: 73 74 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20  st be.** of one 
61a0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
61b0: 20 66 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d   forms: column =
61c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75   expression colu
61d0: 6d 6e 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a  mn > expression.
61e0: 2a 2a 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70  ** column >= exp
61f0: 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c  ression column <
6200: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75   expression colu
6210: 6d 6e 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e  mn <= expression
6220: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d  .** expression =
6230: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
6240: 6f 6e 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72  on > column expr
6250: 65 73 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e  ession >= column
6260: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c  .** expression <
6270: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
6280: 6f 6e 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c  on <= column col
6290: 75 6d 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65  umn IN.** (expre
62a0: 73 73 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75  ssion-list) colu
62b0: 6d 6e 20 49 4e 20 28 73 75 62 71 75 65 72 79 29  mn IN (subquery)
62c0: 20 63 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a   column IS NULL.
62d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
62e0: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
62f0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
6300: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
6310: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
6320: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
6330: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
6340: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
6350: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
6360: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
6370: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
6380: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
6390: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
63a0: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
63b0: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
63c0: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
63d0: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
63e0: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
63f0: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
6400: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
6410: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
6420: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
6430: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
6440: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
6450: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
6460: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
6470: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
6480: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c  p X"..**.** If l
6490: 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64  eft/right preced
64a0: 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20  ence rules come 
64b0: 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64  into play when d
64c0: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a  etermining the.*
64d0: 2a 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  * collating.** s
64e0: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
64f0: 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e  rison, it remain
6500: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
6510: 68 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20  h the same side 
6520: 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d  after.** the com
6530: 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20  mutation. So "Y 
6540: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
6550: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a  p X" becomes .**
6560: 20 22 58 20 6f 70 20 59 22 2e 20 54 68 69 73 20   "X op Y". This 
6570: 69 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63  is because any c
6580: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
6590: 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74  e on.** the left
65a0: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20   hand side of a 
65b0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72  comparison overr
65c0: 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ides any collati
65d0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20  on sequence .** 
65e0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
65f0: 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73  right. For the s
6600: 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45  ame reason the E
6610: 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a  P_Collate flag.*
6620: 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65  * is not commute
6630: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6640: 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61  d exprCommute(Pa
6650: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
6660: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36  r *pExpr){.  u16
6670: 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78   expRight = (pEx
6680: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
6690: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b  s & EP_Collate);
66a0: 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d  .  u16 expLeft =
66b0: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
66c0: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
66d0: 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  te);.  assert( a
66e0: 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e  llowedOp(pExpr->
66f0: 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  op) && pExpr->op
6700: 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28  !=TK_IN );.  if(
6710: 20 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c 65   expRight==expLe
6720: 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  ft ){.    /* Eit
6730: 68 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74 68  her X and Y both
6740: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
6750: 65 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 65  erator or neithe
6760: 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20  r do */.    if( 
6770: 65 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  expRight ){.    
6780: 20 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 20    /* Both X and 
6790: 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  Y have COLLATE o
67a0: 70 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20  perators.  Make 
67b0: 73 75 72 65 20 58 20 69 73 20 61 6c 77 61 79 73  sure X is always
67c0: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62  .      ** used b
67d0: 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 45  y clearing the E
67e0: 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66  P_Collate flag f
67f0: 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20  rom Y. */.      
6800: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
6810: 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c  lags &= ~EP_Coll
6820: 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ate;.    }else i
6830: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
6840: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
6850: 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
6860: 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68  {.      /* Neith
6870: 65 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65 20  er X nor Y have 
6880: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
6890: 73 2c 20 62 75 74 20 58 20 68 61 73 20 61 20 6e  s, but X has a n
68a0: 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 20  on-default.     
68b0: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65   ** collating se
68c0: 71 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 20  quence.  So add 
68d0: 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d  the EP_Collate m
68e0: 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 61  arker on X to ca
68f0: 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  use.      ** it 
6900: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 66  to be searched f
6910: 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  irst. */.      p
6920: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
6930: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
6940: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57  ;.    }.  }.  SW
6950: 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e  AP(Expr*,pExpr->
6960: 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c  pRight,pExpr->pL
6970: 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70  eft);.  if( pExp
6980: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a  r->op>=TK_GT ){.
6990: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
69a0: 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20  T==TK_GT+2 );.  
69b0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
69c0: 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20  =TK_LE+2 );.    
69d0: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
69e0: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
69f0: 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29  t( TK_GT<TK_LE )
6a00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
6a10: 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26  xpr->op>=TK_GT &
6a20: 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f  & pExpr->op<=TK_
6a30: 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  GE );.    pExpr-
6a40: 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f  >op = ((pExpr->o
6a50: 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47  p-TK_GT)^2)+TK_G
6a60: 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  T;.  }.}../*.** 
6a70: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54  Translate from T
6a80: 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f  K_xx operator to
6a90: 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a   WO_xx bitmask..
6aa0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70  */.static u16 op
6ab0: 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f  eratorMask(int o
6ac0: 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61  p){.  u16 c;.  a
6ad0: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
6ae0: 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70  (op) );.  if( op
6af0: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63  ==TK_IN ){.    c
6b00: 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73   = WO_IN;.  }els
6b10: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  e if( op==TK_ISN
6b20: 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  ULL ){.    c = W
6b30: 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73  O_ISNULL;.  }els
6b40: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e{.    assert( (
6b50: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
6b60: 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20  )) < 0x7fff );. 
6b70: 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f     c = (u16)(WO_
6b80: 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b  EQ<<(op-TK_EQ));
6b90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
6ba0: 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
6bb0: 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a  c==WO_ISNULL );.
6bc0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
6bd0: 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20  _IN || c==WO_IN 
6be0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
6bf0: 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_EQ || c==WO_
6c00: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
6c10: 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d  op!=TK_LT || c==
6c20: 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_LT );.  asser
6c30: 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  t( op!=TK_LE || 
6c40: 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73  c==WO_LE );.  as
6c50: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20  sert( op!=TK_GT 
6c60: 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20  || c==WO_GT );. 
6c70: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
6c80: 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29  GE || c==WO_GE )
6c90: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
6ca0: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
6cb0: 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72 65  o the next Where
6cc0: 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65  Term that matche
6cd0: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  s according to t
6ce0: 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 65  he criteria.** e
6cf0: 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e 20  stablished when 
6d00: 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63 74  the pScan object
6d10: 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64   was initialized
6d20: 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e 69   by whereScanIni
6d30: 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  t()..** Return N
6d40: 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65  ULL if there are
6d50: 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69 6e   no more matchin
6d60: 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f  g WhereTerms..*/
6d70: 0a 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72  .WhereTerm *wher
6d80: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
6d90: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
6da0: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
6db0: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
6dc0: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
6dd0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
6de0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
6df0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
6e00: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
6e10: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
6e20: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
6e30: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
6e40: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
6e50: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
6e60: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
6e70: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
6e80: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
6e90: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
6ea0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
6eb0: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
6ec0: 65 73 74 65 64 20 2a 2f 0a 0a 20 20 77 68 69 6c  ested */..  whil
6ed0: 65 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  e( pScan->iEquiv
6ee0: 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  <=pScan->nEquiv 
6ef0: 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53  ){.    iCur = pS
6f00: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61  can->aEquiv[pSca
6f10: 6e 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20  n->iEquiv-2];.  
6f20: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61    iColumn = pSca
6f30: 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d  n->aEquiv[pScan-
6f40: 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20  >iEquiv-1];.    
6f50: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
6f60: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
6f70: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
6f80: 70 57 43 2d 3e 61 2b 70 53 63 61 6e 2d 3e 6b 3b  pWC->a+pScan->k;
6f90: 20 70 53 63 61 6e 2d 3e 6b 3c 70 57 43 2d 3e 6e   pScan->k<pWC->n
6fa0: 54 65 72 6d 3b 20 70 53 63 61 6e 2d 3e 6b 2b 2b  Term; pScan->k++
6fb0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
6fc0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
6fd0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
6fe0: 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  && pTerm->u.left
6ff0: 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
7000: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
7010: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
7020: 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d  or & WO_EQUIV)!=
7030: 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
7040: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72  pScan->nEquiv<Ar
7050: 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61  raySize(pScan->a
7060: 45 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20  Equiv).         
7070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7080: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  int j;.         
7090: 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45     pX = sqlite3E
70a0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
70b0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
70c0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
70d0: 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
70e0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
70f0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
7100: 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71  =0; j<pScan->nEq
7110: 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20  uiv; j+=2){.    
7120: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
7130: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d  can->aEquiv[j]==
7140: 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  pX->iTable.     
7150: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63            && pSc
7160: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d  an->aEquiv[j+1]=
7170: 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  =pX->iColumn ){.
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
71a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
71b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
71c0: 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d     if( j==pScan-
71d0: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20  >nEquiv ){.     
71e0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
71f0: 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e  aEquiv[j] = pX->
7200: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
7210: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71        pScan->aEq
7220: 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69  uiv[j+1] = pX->i
7230: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
7240: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71        pScan->nEq
7250: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  uiv += 2;.      
7260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7270: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
7280: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
7290: 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d  tor & pScan->opM
72a0: 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
72b0: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
72c0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e   the affinity an
72d0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
72e0: 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20  ence match */.  
72f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
7300: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26  can->zCollName &
7310: 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
7320: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29  tor & WO_ISNULL)
7330: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7340: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
7350: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
7360: 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70     pX = pTerm->p
7370: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
7380: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
7390: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
73a0: 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66  pX, pScan->idxaf
73b0: 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  f) ){.          
73c0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
73f0: 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b  sert(pX->pLeft);
7400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7410: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
7420: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
7430: 65 71 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 0a  eq(pWC->pParse,.
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7470: 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d    pX->pLeft, pX-
7480: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
7490: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
74a0: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70  l==0 ) pColl = p
74b0: 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  WC->pParse->db->
74c0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
74d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
74e0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
74f0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
7500: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
7520: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7530: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7550: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
7560: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
7570: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
7580: 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72 6d    && (pX = pTerm
7590: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
75a0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
75c0: 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61  pX->iTable==pSca
75d0: 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a 20 20 20  n->aEquiv[0].   
75e0: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
75f0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d  >iColumn==pScan-
7600: 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20 20 20 20  >aEquiv[1].     
7610: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
7620: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7630: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
7640: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
7650: 6e 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 70 54  n->pCurrent = pT
7660: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  erm;.           
7670: 20 70 53 63 61 6e 2d 3e 6b 2b 2b 3b 0a 20 20 20   pScan->k++;.   
7680: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7690: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
76a0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
76b0: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 20 3d     }.      pWC =
76c0: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53   pScan->pWC = pS
76d0: 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65 72  can->pWC->pOuter
76e0: 3b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b  ;.      pScan->k
76f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
7700: 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63  pScan->pWC = pSc
7710: 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20  an->pOrigWC;.   
7720: 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20   pScan->k = 0;. 
7730: 20 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76     pScan->iEquiv
7740: 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 53 63   += 2;.  }.  pSc
7750: 61 6e 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 30  an->pCurrent = 0
7760: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
7770: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
7780: 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
7790: 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e   scanner object.
77a0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
77b0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72  er to the.** fir
77c0: 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72  st match.  Retur
77d0: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
77e0: 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a  are no matches..
77f0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65  **.** The scanne
7800: 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  r will be search
7810: 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c  ing the WHERE cl
7820: 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77 69  ause pWC.  It wi
7830: 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74  ll look.** for t
7840: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
7850: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
7860: 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75   where X is colu
7870: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  mn iColumn of ta
7880: 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68  ble.** iCur.  Th
7890: 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f  e <op> must be o
78a0: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
78b0: 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62 79  ors described by
78c0: 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49   opMask..**.** I
78d0: 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49  f X is not the I
78e0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
78f0: 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62  EY then X must b
7900: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
7910: 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e  h.** index pIdx.
7920: 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a 77  .*/.WhereTerm *w
7930: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20  hereScanInit(.  
7940: 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e  WhereScan *pScan
7950: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  ,       /* The W
7960: 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20  hereScan object 
7970: 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65  being initialize
7980: 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
7990: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f  se *pWC,       /
79a0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
79b0: 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  se to be scanned
79c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
79e0: 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
79f0: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  for */.  int iCo
7a00: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
7a10: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63   /* Column to sc
7a20: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20  an for */.  u32 
7a30: 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20  opMask,         
7a40: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28      /* Operator(
7a50: 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  s) to scan for *
7a60: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7a80: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
7a90: 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  e with this inde
7aa0: 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b  x */.){.  int j;
7ab0: 0a 0a 20 20 6d 65 6d 73 65 74 28 70 53 63 61 6e  ..  memset(pScan
7ac0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63  , 0, sizeof(*pSc
7ad0: 61 6e 29 29 3b 0a 20 20 70 53 63 61 6e 2d 3e 70  an));.  pScan->p
7ae0: 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20  OrigWC = pWC;.  
7af0: 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43  pScan->pWC = pWC
7b00: 3b 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20  ;.  if( pIdx && 
7b10: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
7b20: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
7b30: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
7b40: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
7b50: 66 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28  finity;.    for(
7b60: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
7b70: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
7b80: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
7b90: 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e   NEVER(j>=pIdx->
7ba0: 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72  nColumn) ) retur
7bb0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
7bc0: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
7bd0: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
7be0: 5d 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  ];.  }.  pScan->
7bf0: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
7c00: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
7c10: 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53  [0] = iCur;.  pS
7c20: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d  can->aEquiv[1] =
7c30: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61   iColumn;.  pSca
7c40: 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20  n->nEquiv = 2;. 
7c50: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d   pScan->iEquiv =
7c60: 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65   2;.  return whe
7c70: 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e  reScanNext(pScan
7c80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  );.}../*.** Sear
7c90: 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e  ch for a term in
7ca0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
7cb0: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
7cc0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
7cd0: 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58  xpr>".** where X
7ce0: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
7cf0: 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f  to the iColumn o
7d00: 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64  f table iCur and
7d10: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a   <op> is one of.
7d20: 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65  ** the WO_xx ope
7d30: 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63  rator codes spec
7d40: 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20  ified by the op 
7d50: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65  parameter..** Re
7d60: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7d70: 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74  o the term.  Ret
7d80: 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75  urn 0 if not fou
7d90: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  nd..**.** The te
7da0: 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68  rm returned migh
7db0: 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66  t by Y=<expr> if
7dc0: 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65   there is anothe
7dd0: 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a  r constraint in.
7de0: 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
7df0: 75 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69  use that specifi
7e00: 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e  es that X=Y.  An
7e10: 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e  y such constrain
7e20: 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64  ts will be.** id
7e30: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
7e40: 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20  WO_EQUIV bit in 
7e50: 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  the pTerm->eOper
7e60: 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65  ator field.  The
7e70: 0a 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72  .** aEquiv[] arr
7e80: 61 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61  ay holds X and a
7e90: 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e  ll its equivalen
7ea0: 74 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51  ts, with each SQ
7eb0: 4c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61  L variable.** ta
7ec0: 6b 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74  king up two slot
7ed0: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20  s in aEquiv[].  
7ee0: 54 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69  The first slot i
7ef0: 73 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72  s for the cursor
7f00: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74   number.** and t
7f10: 68 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72  he second is for
7f20: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
7f30: 65 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32  er.  There are 2
7f40: 32 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  2 slots in aEqui
7f50: 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d  v[].** so that m
7f60: 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b  eans we can look
7f70: 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74   for X plus up t
7f80: 6f 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76  o 10 other equiv
7f90: 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a  alent values..**
7fa0: 20 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20   Hence a search 
7fb0: 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72  for X will retur
7fc0: 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31  n <expr> if X=A1
7fd0: 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41   and A1=A2 and A
7fe0: 32 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20  2=A3.** and ... 
7ff0: 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41  and A9=A10 and A
8000: 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a  10=<expr>..**.**
8010: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75   If there are mu
8020: 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20  ltiple terms in 
8030: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
8040: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
8050: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
8060: 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65  then try for the
8070: 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70   one with no dep
8080: 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78  endencies on <ex
8090: 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77  pr> - in other w
80a0: 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65  ords where.** <e
80b0: 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61  xpr> is a consta
80c0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  nt expression of
80d0: 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c   some kind.  Onl
80e0: 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73  y return entries
80f0: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
8100: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
8110: 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69   Y is a column i
8120: 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  n another table 
8130: 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a  if no terms of.*
8140: 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  * the form "X <o
8150: 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22  p> <const-expr>"
8160: 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20   exist.   If no 
8170: 74 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e  terms with a con
8180: 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69  stant RHS.** exi
8190: 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72  st, try to retur
81a0: 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f  n a term that do
81b0: 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51  es not use WO_EQ
81c0: 55 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  UIV..*/.static W
81d0: 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65  hereTerm *findTe
81e0: 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  rm(.  WhereClaus
81f0: 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
8200: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
8210: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
8220: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
8230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
8240: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  sor number of LH
8250: 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  S */.  int iColu
8260: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn,          /* 
8270: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
8280: 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73   LHS */.  Bitmas
8290: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
82a0: 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20  /* RHS must not 
82b0: 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69  overlap with thi
82c0: 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20  s mask */.  u32 
82d0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
82e0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f    /* Mask of WO_
82f0: 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69  xx values descri
8300: 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f  bing operator */
8310: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
8320: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
8330: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
8340: 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20  ith this index, 
8350: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29  if not NULL */.)
8360: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
8370: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68  Result = 0;.  Wh
8380: 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68  ereTerm *p;.  Wh
8390: 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20  ereScan scan;.. 
83a0: 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e   p = whereScanIn
83b0: 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69  it(&scan, pWC, i
83c0: 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70  Cur, iColumn, op
83d0: 2c 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65  , pIdx);.  while
83e0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
83f0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
8400: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
8410: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
8420: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
8430: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f  (p->eOperator&WO
8440: 5f 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)!=0 ){.     
8450: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
8460: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
8470: 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73  Result==0 ) pRes
8480: 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ult = p;.    }. 
8490: 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e     p = whereScan
84a0: 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d  Next(&scan);.  }
84b0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c  .  return pResul
84c0: 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t;.}../* Forward
84d0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
84e0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
84f0: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
8500: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
8510: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
8520: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
8530: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
8540: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a  ERE clause.  .**
8550: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
8560: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
8570: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
8580: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
8590: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
85a0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
85b0: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
85c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
85d0: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
85e0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
85f0: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
8600: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
8610: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
8620: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
8630: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
8640: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8650: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
8660: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
8670: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
8680: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
8690: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
86a0: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
86b0: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
86c0: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
86d0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
86e0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
86f0: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
8700: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
8710: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
8720: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
8730: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
8740: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
8750: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
8760: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
8770: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
8780: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
8790: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
87a0: 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20  OrGlob(.  Parse 
87b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
87c0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
87d0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
87e0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
87f0: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
8800: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
8810: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
8820: 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e  Prefix,  /* Poin
8830: 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47  ter to TK_STRING
8840: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
8850: 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20   pattern prefix 
8860: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d  */.  int *pisCom
8870: 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69  plete, /* True i
8880: 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63  f the only wildc
8890: 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20  ard is % in the 
88a0: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a  last character *
88b0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65  /.  int *pnoCase
88c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
88d0: 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71   uppercase is eq
88e0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65  uivalent to lowe
88f0: 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  rcase */.){.  co
8900: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
8910: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
8920: 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b  ng on RHS of LIK
8930: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
8940: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
8950: 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69  Left;      /* Ri
8960: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a  ght and left siz
8970: 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  e of LIKE operat
8980: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  or */.  ExprList
8990: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
89a0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70     /* List of op
89b0: 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49  erands to the LI
89c0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
89d0: 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20   int c;         
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
89f0: 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ne character in 
8a00: 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  z[] */.  int cnt
8a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8a20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8a30: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72   non-wildcard pr
8a40: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20  efix characters 
8a50: 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b  */.  char wc[3];
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72  /* Wildcard char
8a80: 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  acters */.  sqli
8a90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8aa0: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
8ab0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
8ac0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8ad0: 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pVal = 0;.  in
8ae0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
8af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
8b00: 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a  de of pRight */.
8b10: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
8b20: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
8b30: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65  , pExpr, pnoCase
8b40: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
8b50: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  urn 0;.  }.#ifde
8b60: 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a  f SQLITE_EBCDIC.
8b70: 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29    if( *pnoCase )
8b80: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
8b90: 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  f.  pList = pExp
8ba0: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c  r->x.pList;.  pL
8bb0: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
8bc0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
8bd0: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
8be0: 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  UMN .   || sqlit
8bf0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
8c00: 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46  Left)!=SQLITE_AF
8c10: 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73  F_TEXT .   || Is
8c20: 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70  Virtual(pLeft->p
8c30: 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  Tab).  ){.    /*
8c40: 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39   IMP: R-02065-49
8c50: 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  465 The left-han
8c60: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49  d side of the LI
8c70: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
8c80: 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  tor must.    ** 
8c90: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
8ca0: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
8cb0: 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e   with TEXT affin
8cc0: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ity. */.    retu
8cd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
8ce0: 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  rt( pLeft->iColu
8cf0: 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42  mn!=(-1) ); /* B
8d00: 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72  ecause IPK never
8d10: 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f   has AFF_TEXT */
8d20: 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69  ..  pRight = pLi
8d30: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
8d40: 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f    op = pRight->o
8d50: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
8d60: 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
8d70: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32  op = pRight->op2
8d80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
8d90: 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20  TK_VARIABLE ){. 
8da0: 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70     Vdbe *pReprep
8db0: 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52  are = pParse->pR
8dc0: 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e  eprepare;.    in
8dd0: 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d  t iCol = pRight-
8de0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56  >iColumn;.    pV
8df0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  al = sqlite3Vdbe
8e00: 47 65 74 56 61 6c 75 65 28 70 52 65 70 72 65 70  GetValue(pReprep
8e10: 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54  are, iCol, SQLIT
8e20: 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20  E_AFF_NONE);.   
8e30: 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c   if( pVal && sql
8e40: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
8e50: 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  pVal)==SQLITE_TE
8e60: 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  XT ){.      z = 
8e70: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
8e80: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
8e90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8ea0: 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
8eb0: 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
8ec0: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65   iCol);.    asse
8ed0: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
8ee0: 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70  TK_VARIABLE || p
8ef0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  Right->op==TK_RE
8f00: 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73  GISTER );.  }els
8f10: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52  e if( op==TK_STR
8f20: 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  ING ){.    z = p
8f30: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  Right->u.zToken;
8f40: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a  .  }.  if( z ){.
8f50: 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
8f60: 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74   while( (c=z[cnt
8f70: 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30  ])!=0 && c!=wc[0
8f80: 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26  ] && c!=wc[1] &&
8f90: 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20   c!=wc[2] ){.   
8fa0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
8fb0: 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26      if( cnt!=0 &
8fc0: 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74  & 255!=(u8)z[cnt
8fd0: 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  -1] ){.      Exp
8fe0: 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20  r *pPrefix;.    
8ff0: 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d    *pisComplete =
9000: 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63   c==wc[0] && z[c
9010: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20  nt+1]==0;.      
9020: 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65  pPrefix = sqlite
9030: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52  3Expr(db, TK_STR
9040: 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69  ING, z);.      i
9050: 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72  f( pPrefix ) pPr
9060: 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63  efix->u.zToken[c
9070: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  nt] = 0;.      *
9080: 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66  ppPrefix = pPref
9090: 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ix;.      if( op
90a0: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
90b0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
90c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
90d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
90e0: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
90f0: 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  v, pRight->iColu
9100: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
9110: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26   *pisComplete &&
9120: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
9130: 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[1] ){.        
9140: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20    /* If the rhs 
9150: 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72  of the LIKE expr
9160: 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69  ession is a vari
9170: 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75  able, and the cu
9180: 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  rrent.          
9190: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
91a0: 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74  variable means t
91b0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
91c0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49  to invoke the LI
91d0: 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  KE.          ** 
91e0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e  function, then n
91f0: 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69  o OP_Variable wi
9200: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
9210: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
9220: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
9230: 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f  uses problems fo
9240: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  r the sqlite3_bi
9250: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
9260: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
9270: 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f   API. To workaro
9280: 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20  und them, add a 
9290: 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c  dummy OP_Variabl
92a0: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20  e here..        
92b0: 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
92c0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
92d0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
92e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
92f0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
9300: 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67  get(pParse, pRig
9310: 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ht, r1);.       
9320: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
9330: 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65  angeP3(v, sqlite
9340: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
9350: 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  (v)-1, 0);.     
9360: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
9370: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
9380: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
9390: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
93a0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30  lse{.      z = 0
93b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
93c0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
93d0: 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
93e0: 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  (z!=0);.}.#endif
93f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9400: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
9410: 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N */...#ifndef S
9420: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9430: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68  ALTABLE./*.** Ch
9440: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
9450: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
9460: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
9470: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
9480: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
9490: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  r.**.** If it is
94a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55   then return TRU
94b0: 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  E.  If not, retu
94c0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
94d0: 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f  tic int isMatchO
94e0: 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20  fColumn(.  Expr 
94f0: 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54  *pExpr      /* T
9500: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
9510: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ion */.){.  Expr
9520: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
9530: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
9540: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
9550: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9560: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
9570: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
9580: 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30  oken,"match")!=0
9590: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
95a0: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
95b0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
95c0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
95d0: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
95e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
95f0: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
9600: 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c  pr->op != TK_COL
9610: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
9620: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
9630: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
9640: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
9650: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
9660: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
9670: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
9680: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
9690: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
96a0: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
96b0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
96c0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
96d0: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
96e0: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
96f0: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
9700: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
9710: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
9720: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
9730: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
9740: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
9750: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
9760: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
9770: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
9780: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
9790: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
97a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
97b0: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
97c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
97d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f  OMIT_SUBQUERY)./
97e0: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74  *.** Analyze a t
97f0: 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74  erm that consist
9800: 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s of two or more
9810: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a   OR-connected.**
9820: 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69   subterms.  So i
9830: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  n:.**.**     ...
9840: 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e   WHERE  (a=5) AN
9850: 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52  D (b=7 OR c=9 OR
9860: 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33   d=13) AND (d=13
9870: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e                ^^
9890: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
98a0: 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ^^.**.** This ro
98b0: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
98c0: 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65  erms such as the
98d0: 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20   middle term in 
98e0: 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c  the above exampl
98f0: 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54  e..** A WhereOrT
9900: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
9910: 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63  mputed and attac
9920: 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20  hed to the term 
9930: 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69  under.** analysi
9940: 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  s, regardless of
9950: 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20   the outcome of 
9960: 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48  the analysis.  H
9970: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ence:.**.**     
9980: 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67  WhereTerm.wtFlag
9990: 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49  s   |=  TERM_ORI
99a0: 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  NFO.**     Where
99b0: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20  Term.u.pOrInfo  
99c0: 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  =  a dynamically
99d0: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
99e0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a  OrTerm object.**
99f0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69  .** The term bei
9a00: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74  ng analyzed must
9a10: 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72   have two or mor
9a20: 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  e of OR-connecte
9a30: 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41  d subterms..** A
9a40: 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20   single subterm 
9a50: 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f  might be a set o
9a60: 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  f AND-connected 
9a70: 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a  sub-subterms..**
9a80: 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72   Examples of ter
9a90: 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69  ms under analysi
9aa0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29  s:.**.**     (A)
9ab0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
9ac0: 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74  R t1.x=t2.z OR t
9ad0: 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74  1.y=15 OR t1.z=t
9ae0: 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29  3.a+5.**     (B)
9af0: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
9b00: 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70  expr2=x OR x=exp
9b10: 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20  r3.**     (C)   
9b20: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28    t1.x=t2.y OR (
9b30: 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31  t1.x=t2.z AND t1
9b40: 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44  .y=15).**     (D
9b50: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
9b60: 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20   (y>11 AND y<22 
9b70: 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c  AND z LIKE '*hel
9b80: 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29  lo*').**     (E)
9b90: 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20       (p.a=1 AND 
9ba0: 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29  q.b=2 AND r.c=3)
9bb0: 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71   OR (p.x=4 AND q
9bc0: 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a  .y=5 AND r.z=6).
9bd0: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a  **.** CASE 1:.**
9be0: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
9bf0: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
9c00: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72  orm T.C=expr for
9c10: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c   some single col
9c20: 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20  umn of C and.** 
9c30: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
9c40: 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78   (as shown in ex
9c50: 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74  ample B above) t
9c60: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
9c70: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
9c80: 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69   that is an equi
9c90: 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73  valent IN expres
9ca0: 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  sion.  In other 
9cb0: 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65  words, if the te
9cc0: 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c  rm.** being anal
9cd0: 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  yzed is:.**.**  
9ce0: 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f      x = expr1  O
9cf0: 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52  R  expr2 = x  OR
9d00: 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a    x = expr3.**.*
9d10: 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
9d20: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
9d30: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
9d40: 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70  *      x IN (exp
9d50: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a  r1,expr2,expr3).
9d60: 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a  **.** CASE 2:.**
9d70: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
9d80: 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c  rms are indexabl
9d90: 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61  e by a single ta
9da0: 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a  ble T, then set.
9db0: 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  **.**     WhereT
9dc0: 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20  erm.eOperator   
9dd0: 20 20 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f             =  WO
9de0: 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  _OR.**     Where
9df0: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  Term.u.pOrInfo->
9e00: 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74  indexable  |=  t
9e10: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
9e20: 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a   for table T.**.
9e30: 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20  ** A subterm is 
9e40: 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69  "indexable" if i
9e50: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
9e60: 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65  .** "T.C <op> <e
9e70: 78 70 72 3e 22 20 77 68 65 72 65 20 43 20 69 73  xpr>" where C is
9e80: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   any column of t
9e90: 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c  able T and .** <
9ea0: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d  op> is one of "=
9eb0: 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e  ", "<", "<=", ">
9ec0: 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c  ", ">=", "IS NUL
9ed0: 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20  L", or "IN"..** 
9ee0: 41 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73  A subterm is als
9ef0: 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69  o indexable if i
9f00: 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74  t is an AND of t
9f10: 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75  wo or more.** su
9f20: 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61  bsubterms at lea
9f30: 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20  st one of which 
9f40: 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49  is indexable.  I
9f50: 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a  ndexable AND .**
9f60: 20 73 75 62 74 65 72 6d 73 20 68 61 76 65 20 74   subterms have t
9f70: 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73  heir eOperator s
9f80: 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64  et to WO_AND and
9f90: 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e   they have.** u.
9fa0: 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20  pAndInfo set to 
9fb0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
9fc0: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e 64  located WhereAnd
9fd0: 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Term object..**.
9fe0: 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20  ** From another 
9ff0: 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22  point of view, "
a000: 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73  indexable" means
a010: 20 74 68 61 74 20 74 68 65 20 73 75 62 74 65 72   that the subter
a020: 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e  m could.** poten
a030: 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77  tially be used w
a040: 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20  ith an index if 
a050: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 69  an appropriate i
a060: 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20  ndex exists..** 
a070: 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f  This analysis do
a080: 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20  es not consider 
a090: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
a0a0: 68 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b  he index exists;
a0b0: 20 74 68 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65   that.** is some
a0c0: 74 68 69 6e 67 20 74 68 65 20 62 65 73 74 49 6e  thing the bestIn
a0d0: 64 65 78 28 29 20 72 6f 75 74 69 6e 65 20 77 69  dex() routine wi
a0e0: 6c 6c 20 64 65 74 65 72 6d 69 6e 65 2e 20 20 54  ll determine.  T
a0f0: 68 69 73 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20  his analysis.** 
a100: 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68  only looks at wh
a110: 65 74 68 65 72 20 73 75 62 74 65 72 6d 73 20 61  ether subterms a
a120: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
a130: 6e 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a  ndexing exist..*
a140: 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65  *.** All example
a150: 73 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62  s A through E ab
a160: 6f 76 65 20 61 6c 6c 20 73 61 74 69 73 66 79 20  ove all satisfy 
a170: 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20  case 2.  But if 
a180: 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73  a term.** also s
a190: 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31  tatisfies case 1
a1a0: 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20   (such as B) we 
a1b0: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70  know that the op
a1c0: 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20  timizer will.** 
a1d0: 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61  always prefer ca
a1e0: 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74  se 1, so in that
a1f0: 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64   case we pretend
a200: 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20   that case 2 is 
a210: 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64  not.** satisfied
a220: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74  ..**.** It might
a230: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
a240: 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65  t multiple table
a250: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e  s are indexable.
a260: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a    For example,.*
a270: 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69  * (E) above is i
a280: 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c  ndexable on tabl
a290: 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a  es P, Q, and R..
a2a0: 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74  **.** Terms that
a2b0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20   satisfy case 2 
a2c0: 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66  are candidates f
a2d0: 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69  or lookup by usi
a2e0: 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69  ng.** separate i
a2f0: 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72  ndices to find r
a300: 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73  owids for each s
a310: 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f  ubterm and compo
a320: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f  sing.** the unio
a330: 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20  n of all rowids 
a340: 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f  using a RowSet o
a350: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20  bject.  This is 
a360: 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62  similar.** to "b
a370: 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69  itmap indices" i
a380: 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  n other database
a390: 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20   engines..**.** 
a3a0: 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a  OTHERWISE:.**.**
a3b0: 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65   If neither case
a3c0: 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70   1 nor case 2 ap
a3d0: 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20  ply, then leave 
a3e0: 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65  the eOperator se
a3f0: 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54  t to.** zero.  T
a400: 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
a410: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63  useful for searc
a420: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
a430: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  d exprAnalyzeOrT
a440: 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  erm(.  SrcList *
a450: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
a460: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
a470: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
a480: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
a490: 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65     /* the comple
a4a0: 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
a4b0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a4d0: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  * Index of the O
a4e0: 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  R-term to be ana
a4f0: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61  lyzed */.){.  Pa
a500: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
a510: 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20  C->pParse;      
a520: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
a530: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
a540: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a550: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
a560: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
a570: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
a580: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
a590: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
a5a0: 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20  erm];    /* The 
a5b0: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
a5c0: 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  zed */.  Expr *p
a5d0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
a5e0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
a5f0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
a600: 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a  on of the term *
a610: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
a620: 20 2a 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43   *pMaskSet = pWC
a630: 2d 3e 70 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54  ->pMaskSet; /* T
a640: 61 62 6c 65 20 75 73 65 20 6d 61 73 6b 73 20 2a  able use masks *
a650: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a680: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
a690: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
a6a0: 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42  OrWc;       /* B
a6b0: 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20  reakup of pTerm 
a6c0: 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
a6d0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f  .  WhereTerm *pO
a6e0: 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20  rTerm;       /* 
a6f0: 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69  A Sub-term withi
a700: 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20  n the pOrWc */. 
a710: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f   WhereOrInfo *pO
a720: 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64  rInfo;     /* Ad
a730: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
a740: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
a750: 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20  with pTerm */.  
a760: 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e  Bitmask chngToIN
a770: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
a780: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
a790: 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f  atisfy case 1 */
a7a0: 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78  .  Bitmask index
a7b0: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  able;        /* 
a7c0: 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  Tables that are 
a7d0: 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73  indexable, satis
a7e0: 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a  fying case 2 */.
a7f0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b  .  /*.  ** Break
a800: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
a810: 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65  nto its separate
a820: 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20   subterms.  The 
a830: 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a  subterms are.  *
a840: 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68  * stored in a Wh
a850: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
a860: 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77  ure containing w
a870: 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f  ithin the WhereO
a880: 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63  rInfo.  ** objec
a890: 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68  t that is attach
a8a0: 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ed to the origin
a8b0: 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72  al OR clause ter
a8c0: 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  m..  */.  assert
a8d0: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
a8e0: 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49  s & (TERM_DYNAMI
a8f0: 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45  C|TERM_ORINFO|TE
a900: 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20  RM_ANDINFO))==0 
a910: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
a920: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  pr->op==TK_OR );
a930: 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  .  pTerm->u.pOrI
a940: 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20  nfo = pOrInfo = 
a950: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
a960: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
a970: 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28  pOrInfo));.  if(
a980: 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65   pOrInfo==0 ) re
a990: 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  turn;.  pTerm->w
a9a0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
a9b0: 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d  RINFO;.  pOrWc =
a9c0: 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20   &pOrInfo->wc;. 
a9d0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
a9e0: 28 70 4f 72 57 63 2c 20 70 57 43 2d 3e 70 50 61  (pOrWc, pWC->pPa
a9f0: 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70  rse, pMaskSet, p
aa00: 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b  WC->wctrlFlags);
aa10: 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f  .  whereSplit(pO
aa20: 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  rWc, pExpr, TK_O
aa30: 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a  R);.  exprAnalyz
aa40: 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63  eAll(pSrc, pOrWc
aa50: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
aa60: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
aa70: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  rn;.  assert( pO
aa80: 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b  rWc->nTerm>=2 );
aa90: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70  ..  /*.  ** Comp
aaa0: 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74  ute the set of t
aab0: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
aac0: 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31   satisfy cases 1
aad0: 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e   or 2..  */.  in
aae0: 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d  dexable = ~(Bitm
aaf0: 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49  ask)0;.  chngToI
ab00: 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  N = ~(Bitmask)0;
ab10: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
ab20: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
ab30: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
ab40: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
ab50: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
ab60: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
ab70: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
ab80: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
ab90: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
aba0: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
abb0: 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65    assert( (pOrTe
abc0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
abd0: 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d  ERM_ANDINFO|TERM
abe0: 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  _ORINFO))==0 );.
abf0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
ac00: 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e   0;.      pAndIn
ac10: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
ac20: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
ac30: 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a  of(*pAndInfo));.
ac40: 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e        if( pAndIn
ac50: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  fo ){.        Wh
ac60: 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57  ereClause *pAndW
ac70: 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  C;.        Where
ac80: 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a  Term *pAndTerm;.
ac90: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
aca0: 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
acb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
acc0: 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
acd0: 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20  o = pAndInfo;.  
ace0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
acf0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41  tFlags |= TERM_A
ad00: 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20  NDINFO;.        
ad10: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
ad20: 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20  or = WO_AND;.   
ad30: 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70       pAndWC = &p
ad40: 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
ad50: 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65       whereClause
ad60: 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43  Init(pAndWC, pWC
ad70: 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53  ->pParse, pMaskS
ad80: 65 74 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c  et, pWC->wctrlFl
ad90: 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 77 68  ags);.        wh
ada0: 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c  ereSplit(pAndWC,
adb0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c   pOrTerm->pExpr,
adc0: 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20   TK_AND);.      
add0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
ade0: 28 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a  (pSrc, pAndWC);.
adf0: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e          pAndWC->
ae00: 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
ae10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ae20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ae30: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ae40: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
ae50: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  d ){.          f
ae60: 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d  or(j=0, pAndTerm
ae70: 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41  =pAndWC->a; j<pA
ae80: 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  ndWC->nTerm; j++
ae90: 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20  , pAndTerm++){. 
aea0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
aeb0: 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  t( pAndTerm->pEx
aec0: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pr );.          
aed0: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
aee0: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d  pAndTerm->pExpr-
aef0: 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >op) ){.        
af00: 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61        b |= getMa
af10: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 41 6e  sk(pMaskSet, pAn
af20: 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  dTerm->leftCurso
af30: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
af40: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
af50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
af60: 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a  indexable &= b;.
af70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
af80: 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77  e if( pOrTerm->w
af90: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
afa0: 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  PIED ){.      /*
afb0: 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20   Skip this term 
afc0: 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76  for now.  We rev
afd0: 69 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20  isit it when we 
afe0: 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20  process the.    
aff0: 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69    ** correspondi
b000: 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  ng TERM_VIRTUAL 
b010: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  term */.    }els
b020: 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
b030: 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65   b;.      b = ge
b040: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
b050: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
b060: 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
b070: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
b080: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
b090: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
b0a0: 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
b0b0: 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d  pOrWc->a[pOrTerm
b0c0: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
b0d0: 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b      b |= getMask
b0e0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65  (pMaskSet, pOthe
b0f0: 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  r->leftCursor);.
b100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
b110: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
b120: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
b130: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
b140: 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)==0 ){.     
b150: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
b160: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b170: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26        chngToIN &
b180: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
b190: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
b1a0: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74  * Record the set
b1b0: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
b1c0: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
b1d0: 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62   The set might b
b1e0: 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20  e.  ** empty..  
b1f0: 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e  */.  pOrInfo->in
b200: 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61  dexable = indexa
b210: 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f  ble;.  pTerm->eO
b220: 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61  perator = indexa
b230: 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f  ble==0 ? 0 : WO_
b240: 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63  OR;..  /*.  ** c
b250: 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20  hngToIN holds a 
b260: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
b270: 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73  at *might* satis
b280: 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a  fy case 1.  But.
b290: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
b2a0: 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  do some addition
b2b0: 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  al checking to s
b2c0: 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61  ee if case 1 rea
b2d0: 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69  lly.  ** is sati
b2e0: 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sfied..  **.  **
b2f0: 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68   chngToIN will h
b300: 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c  old either 0, 1,
b310: 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65   or 2 bits.  The
b320: 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e   0-bit case mean
b330: 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72  s.  ** that ther
b340: 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c  e is no possibil
b350: 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ity of transform
b360: 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73  ing the OR claus
b370: 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49  e into an.  ** I
b380: 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75  N operator becau
b390: 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  se one or more t
b3a0: 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63  erms in the OR c
b3b0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20  lause contain.  
b3c0: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ** something oth
b3d0: 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20  er than == on a 
b3e0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69  column in the si
b3f0: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
b400: 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65   1-bit.  ** case
b410: 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72   means that ever
b420: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
b430: 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68   clause is of th
b440: 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62  e form.  ** "tab
b450: 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20  le.column=expr" 
b460: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
b470: 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20  table.  The one 
b480: 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a  bit that is set.
b490: 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73    ** will corres
b4a0: 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d  pond to the comm
b4b0: 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74  on table.  We st
b4c0: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63  ill need to chec
b4d0: 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  k to make.  ** s
b4e0: 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ure the same col
b4f0: 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61  umn is used on a
b500: 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32  ll terms.  The 2
b510: 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65  -bit case is whe
b520: 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74  n.  ** the all t
b530: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
b540: 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c  form "table1.col
b550: 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d  umn=table2.colum
b560: 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67  n".  It.  ** mig
b570: 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ht be possible t
b580: 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65  o form an IN ope
b590: 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65  rator with eithe
b5a0: 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a  r table1.column.
b5b0: 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63    ** or table2.c
b5c0: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53  olumn as the LHS
b5d0: 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f   if either is co
b5e0: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
b5f0: 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f  rm of.  ** the O
b600: 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  R clause..  **. 
b610: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65   ** Note that te
b620: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
b630: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74  "table.column1=t
b640: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74  able.column2" (t
b650: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
b660: 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73  le on both sizes
b670: 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e   of the ==) cann
b680: 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e  ot be optimized.
b690: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67  .  */.  if( chng
b6a0: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ToIN ){.    int 
b6b0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
b6c0: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
b6d0: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
b6e0: 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a  to IN is valid *
b6f0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  /.    int iColum
b700: 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  n = -1;         
b710: 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  /* Column index 
b720: 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65  on lhs of IN ope
b730: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  rator */.    int
b740: 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20   iCursor = -1;  
b750: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
b760: 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f  cursor common to
b770: 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20   all terms */.  
b780: 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20    int j = 0;    
b790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b7a0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
b7b0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
b7c0: 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  r a table and co
b7d0: 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72  lumn that appear
b7e0: 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72  s on one side or
b7f0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
b800: 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72  r of the == oper
b810: 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75  ator in every su
b820: 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62  bterm.  That tab
b830: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20  le and column.  
b840: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63    ** will be rec
b850: 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72  orded in iCursor
b860: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54   and iColumn.  T
b870: 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  here might not b
b880: 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  e any.    ** suc
b890: 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  h table and colu
b8a0: 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e  mn.  Set okToChn
b8b0: 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72  gToIN if an appr
b8c0: 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20  opriate table.  
b8d0: 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20    ** and column 
b8e0: 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61  is found but lea
b8f0: 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  ve okToChngToIN 
b900: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75  false if not fou
b910: 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  nd..    */.    f
b920: 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21  or(j=0; j<2 && !
b930: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b  okToChngToIN; j+
b940: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72  +){.      pOrTer
b950: 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20  m = pOrWc->a;.  
b960: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
b970: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
b980: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
b990: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b9a0: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
b9b0: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
b9c0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
b9d0: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
b9e0: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
b9f0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
ba00: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
ba10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
ba20: 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d 62   This is the 2-b
ba30: 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20 61  it case and we a
ba40: 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  re on the second
ba50: 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20   iteration and. 
ba60: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
ba70: 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d  ent term is from
ba80: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
ba90: 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74  tion.  So skip t
baa0: 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  his term. */.   
bab0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
bac0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
bad0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
bae0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
baf0: 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74   (chngToIN & get
bb00: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
bb10: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
bb20: 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or))==0 ){.     
bb30: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72       /* This ter
bb40: 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65  m must be of the
bb50: 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62   form t1.a==t2.b
bb60: 20 77 68 65 72 65 20 74 32 20 69 73 20 69 6e 20   where t2 is in 
bb70: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
bb80: 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75   chngToIN set bu
bb90: 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68  t t1 is not.  Th
bba0: 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20  is term will be 
bbb0: 65 69 74 68 65 72 20 70 72 65 63 65 65 64 65 64  either preceeded
bbc0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
bbd0: 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69   follwed by an i
bbe0: 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74 32  nverted copy (t2
bbf0: 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70  .b==t1.a).  Skip
bc00: 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20   this term .    
bc10: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65        ** and use
bc20: 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20   its inversion. 
bc30: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
bc40: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
bc50: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
bc60: 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20  OPIED );.       
bc70: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72     testcase( pOr
bc80: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
bc90: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
bca0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
bcb0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
bcc0: 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45  gs & (TERM_COPIE
bcd0: 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20  D|TERM_VIRTUAL) 
bce0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
bcf0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
bd00: 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  .        iColumn
bd10: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65   = pOrTerm->u.le
bd20: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
bd30: 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54    iCursor = pOrT
bd40: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b  erm->leftCursor;
bd50: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
bd60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
bd70: 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( i<0 ){.       
bd80: 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65   /* No candidate
bd90: 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61   table+column wa
bda0: 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63  s found.  This c
bdb0: 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20  an only occur.  
bdc0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
bdd0: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
bde0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
bdf0: 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20  rt( j==1 );.    
be00: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
be10: 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49  werOfTwo(chngToI
be20: 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  N) );.        as
be30: 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d  sert( chngToIN==
be40: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
be50: 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  , iCursor) );.  
be60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
be70: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
be80: 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20  ase( j==1 );..  
be90: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66      /* We have f
bea0: 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65  ound a candidate
beb0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
bec0: 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  n.  Check to see
bed0: 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   if that.      *
bee0: 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  * table and colu
bef0: 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  mn is common to 
bf00: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
bf10: 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20  e OR clause */. 
bf20: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
bf30: 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  N = 1;.      for
bf40: 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43  (; i>=0 && okToC
bf50: 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f  hngToIN; i--, pO
bf60: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
bf70: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
bf80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
bf90: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
bfa0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
bfb0: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
bfc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
bfd0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
bfe0: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
bff0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
c000: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
c010: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
c020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54  ){.          okT
c030: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
c040: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c050: 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c          int affL
c060: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
c070: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
c080: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
c090: 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  de is also a col
c0a0: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66  umn, then the af
c0b0: 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20  finities.       
c0c0: 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69     ** of both ri
c0d0: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64  ght and left sid
c0e0: 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20  es must be such 
c0f0: 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20  that no type.   
c100: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72         ** conver
c110: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
c120: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
c130: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
c140: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
c150: 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74          affRight
c160: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
c170: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
c180: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
c190: 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66            affLef
c1a0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
c1b0: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
c1c0: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
c1d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66            if( af
c1e0: 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66  fRight!=0 && aff
c1f0: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
c200: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b  {.            ok
c210: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
c220: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
c230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
c240: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
c250: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
c260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c270: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c280: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
c290: 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67   point, okToChng
c2a0: 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20  ToIN is true if 
c2b0: 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73  original pTerm s
c2c0: 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20  atisfies.    ** 
c2d0: 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74  case 1.  In that
c2e0: 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74   case, construct
c2f0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
c300: 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20  erm that is .   
c310: 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72   ** pTerm conver
c320: 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  ted into an IN o
c330: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a 0a  perator..    **.
c340: 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30 32      ** EV: R-002
c350: 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f 0a  11-15100.    */.
c360: 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67      if( okToChng
c370: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  ToIN ){.      Ex
c380: 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20  pr *pDup;       
c390: 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69       /* A transi
c3a0: 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78  ent duplicate ex
c3b0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
c3c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
c3d0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  t = 0;   /* The 
c3e0: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
c3f0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
c400: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
c410: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
c420: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
c430: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
c440: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
c450: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
c460: 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  lete IN operator
c470: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
c480: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
c490: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
c4a0: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  a; i>=0; i--, pO
c4b0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
c4c0: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
c4d0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
c4e0: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
c4f0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
c500: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
c510: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
c520: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
c530: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
c540: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
c550: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
c560: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
c570: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
c580: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
c590: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
c5a0: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
c5b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
c5c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
c5d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c5e0: 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50  stAppend(pWC->pP
c5f0: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
c600: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
c610: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
c620: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
c630: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
c640: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
c650: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
c660: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
c670: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
c680: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
c690: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
c6a0: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
c6b0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
c6c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
c6d0: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
c6e0: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
c6f0: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
c700: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
c710: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
c720: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
c730: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
c740: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
c750: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
c760: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
c770: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
c780: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
c790: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
c7a0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
c7b0: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
c7c0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
c7d0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
c7e0: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
c7f0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
c800: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
c810: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
c820: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
c830: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
c840: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c850: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c860: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
c870: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
c880: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
c890: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
c8a0: 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20  tor = WO_NOOP;  
c8b0: 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73  /* case 1 trumps
c8c0: 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d   case 2 */.    }
c8d0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
c8e0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52   !SQLITE_OMIT_OR
c8f0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26  _OPTIMIZATION &&
c900: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55   !SQLITE_OMIT_SU
c910: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
c920: 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   The input to th
c930: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
c940: 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63   WhereTerm struc
c950: 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74  ture with only t
c960: 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69  he.** "pExpr" fi
c970: 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20  eld filled in.  
c980: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
c990: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e  routine is to an
c9a0: 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62  alyze the.** sub
c9b0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
c9c0: 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20  opulate all the 
c9d0: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
c9e0: 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a  the WhereTerm.**
c9f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
ca00: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
ca10: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
ca20: 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20  rm "<expr> <op> 
ca30: 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75  X" it gets commu
ca40: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ted.** to the st
ca50: 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22  andard form of "
ca60: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a  X <op> <expr>"..
ca70: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
ca80: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
ca90: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
caa0: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61  " where both X a
cab0: 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75  nd Y are.** colu
cac0: 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  mns, then the or
cad0: 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f  iginal expressio
cae0: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
caf0: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  nd a new virtual
cb00: 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20  .** term of the 
cb10: 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20  form "Y <op> X" 
cb20: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
cb30: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
cb40: 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70  .** analyzed sep
cb50: 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72  arately.  The or
cb60: 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d  iginal term is m
cb70: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
cb80: 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68  COPIED.** and th
cb90: 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61  e new term is ma
cba0: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44  rked with TERM_D
cbb0: 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20  YNAMIC (because 
cbc0: 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65  it's pExpr.** ne
cbd0: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
cbe0: 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c  with the WhereCl
cbf0: 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56  ause) and TERM_V
cc00: 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20  IRTUAL (because 
cc10: 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75  it.** is a commu
cc20: 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72  ted copy of a pr
cc30: 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20  ior term.)  The 
cc40: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61  original term ha
cc50: 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e  s nChild=1.** an
cc60: 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69  d the copy has i
cc70: 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20  dxParent set to 
cc80: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
cc90: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a   original term..
cca0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
ccb0: 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72  xprAnalyze(.  Sr
ccc0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
ccd0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
cce0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
ccf0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
cd00: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
cd10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
cd20: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd40: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72  Index of the ter
cd50: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
cd60: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
cd70: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
cd80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
cd90: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
cda0: 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d  yzed */.  WhereM
cdb0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
cdc0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
cdd0: 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78  t of table index
cde0: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72   masks */.  Expr
cdf0: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20   *pExpr;        
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
ce20: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
ce30: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
ce40: 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  qLeft;          
ce50: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
ce60: 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70  ites of the pExp
ce70: 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69  r->pLeft */.  Bi
ce80: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cea0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
ceb0: 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69  of pExpr */.  Bi
cec0: 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74  tmask extraRight
ced0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
cee0: 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e  * Extra dependen
cef0: 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49  cies on LEFT JOI
cf00: 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74  N */.  Expr *pSt
cf10: 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  r1 = 0;         
cf20: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
cf30: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
cf40: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ator */.  int is
cf50: 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20  Complete = 0;   
cf60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
cf70: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65  S of LIKE/GLOB e
cf80: 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72  nds with wildcar
cf90: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73  d */.  int noCas
cfa0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
cfb0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f          /* LIKE/
cfc0: 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68  GLOB distinguish
cfd0: 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  es case */.  int
cfe0: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d000: 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61   Top-level opera
d010: 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20  tor.  pExpr->op 
d020: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
d030: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
d040: 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ;     /* Parsing
d050: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
d060: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d070: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f  se->db;        /
d080: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
d090: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
d0a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d0b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
d0c0: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
d0d0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
d0e0: 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43    pMaskSet = pWC
d0f0: 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45  ->pMaskSet;.  pE
d100: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
d110: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  pr;.  assert( pE
d120: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 26  xpr->op!=TK_AS &
d130: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
d140: 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70 72 65  COLLATE );.  pre
d150: 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61  reqLeft = exprTa
d160: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
d170: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
d180: 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
d190: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
d1a0: 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _IN ){.    asser
d1b0: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
d1c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45  ==0 );.    if( E
d1d0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
d1e0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
d1f0: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65  ct) ){.      pTe
d200: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
d210: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
d220: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
d230: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
d240: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
d250: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
d260: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69  eqRight = exprLi
d270: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
d280: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
d290: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
d2a0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
d2b0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  _ISNULL ){.    p
d2c0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
d2d0: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
d2e0: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
d2f0: 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62  qRight = exprTab
d300: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
d310: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
d320: 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c  ;.  }.  prereqAl
d330: 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  l = exprTableUsa
d340: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
d350: 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  pr);.  if( ExprH
d360: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
d370: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
d380: 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20  {.    Bitmask x 
d390: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
d3a0: 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68  et, pExpr->iRigh
d3b0: 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20  tJoinTable);.   
d3c0: 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b   prereqAll |= x;
d3d0: 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20  .    extraRight 
d3e0: 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c  = x-1;  /* ON cl
d3f0: 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e  ause terms may n
d400: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
d410: 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  an index.       
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65  ** on left table
d440: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
d450: 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a    Ticket #3015 *
d460: 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70  /.  }.  pTerm->p
d470: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
d480: 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c  qAll;.  pTerm->l
d490: 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  eftCursor = -1;.
d4a0: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
d4b0: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
d4c0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  eOperator = 0;. 
d4d0: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f   if( allowedOp(o
d4e0: 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  p) ){.    Expr *
d4f0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
d500: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
d510: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
d520: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
d530: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
d540: 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70  Collate(pExpr->p
d550: 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36 20  Right);.    u16 
d560: 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d  opMask = (pTerm-
d570: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
d580: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20  rereqLeft)==0 ? 
d590: 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49  WO_ALL : WO_EQUI
d5a0: 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  V;.    if( pLeft
d5b0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
d5c0: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
d5d0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
d5e0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
d5f0: 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43    pTerm->u.leftC
d600: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
d610: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
d620: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
d630: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
d640: 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  ) & opMask;.    
d650: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
d660: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
d670: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
d680: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
d690: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
d6a0: 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36 20  pDup;.      u16 
d6b0: 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20 20  eExtraOp = 0;   
d6c0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 69       /* Extra bi
d6d0: 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70  ts for pNew->eOp
d6e0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
d6f0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
d700: 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ursor>=0 ){.    
d710: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
d720: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
d730: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
d740: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
d750: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
d760: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
d770: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d780: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
d790: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
d7a0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
d7b0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
d7c0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
d7d0: 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45  rt(pWC, pDup, TE
d7e0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
d7f0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
d800: 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20    if( idxNew==0 
d810: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
d820: 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61    pNew = &pWC->a
d830: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
d840: 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20    pNew->iParent 
d850: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
d860: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
d870: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
d880: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
d890: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld = 1;.        
d8a0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
d8b0: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
d8c0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
d8d0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20  ->op==TK_EQ.    
d8e0: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
d8f0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
d900: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
d910: 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
d920: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
d930: 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69   SQLITE_Transiti
d940: 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ve).        ){. 
d950: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
d960: 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f  eOperator |= WO_
d970: 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20  EQUIV;.         
d980: 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45   eExtraOp = WO_E
d990: 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a  QUIV;.        }.
d9a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d9b0: 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70       pDup = pExp
d9c0: 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  r;.        pNew 
d9d0: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
d9e0: 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75  .      exprCommu
d9f0: 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29  te(pParse, pDup)
da00: 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20  ;.      pLeft = 
da10: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
da20: 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c 65  ollate(pDup->pLe
da30: 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ft);.      pNew-
da40: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
da50: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
da60: 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43     pNew->u.leftC
da70: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
da80: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65  Column;.      te
da90: 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c  stcase( (prereqL
daa0: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74  eft | extraRight
dab0: 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ) != prereqLeft 
dac0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
dad0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
dae0: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
daf0: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  ight;.      pNew
db00: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
db10: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
db20: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
db30: 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70   (operatorMask(p
db40: 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72  Dup->op) + eExtr
db50: 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  aOp) & opMask;. 
db60: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
db70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  f SQLITE_OMIT_BE
db80: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
db90: 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72  ON.  /* If a ter
dba0: 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e  m is the BETWEEN
dbb0: 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74   operator, creat
dbc0: 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61  e two new virtua
dbd0: 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61  l terms.  ** tha
dbe0: 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e  t define the ran
dbf0: 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57  ge that the BETW
dc00: 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20  EEN implements. 
dc10: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   For example:.  
dc20: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42  **.  **      a B
dc30: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20  ETWEEN b AND c. 
dc40: 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76   **.  ** is conv
dc50: 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  erted into:.  **
dc60: 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45  .  **      (a BE
dc70: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41  TWEEN b AND c) A
dc80: 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61  ND (a>=b) AND (a
dc90: 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <=c).  **.  ** T
dca0: 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73  he two new terms
dcb0: 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20   are added onto 
dcc0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
dcd0: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
dce0: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20  t..  ** The new 
dcf0: 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d  terms are "dynam
dd00: 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c  ic" and are chil
dd10: 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67  dren of the orig
dd20: 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a  inal BETWEEN.  *
dd30: 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65  * term.  That me
dd40: 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20  ans that if the 
dd50: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
dd60: 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64  coded, the child
dd70: 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69  ren are.  ** ski
dd80: 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68  pped.  Or, if th
dd90: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73  e children are s
dda0: 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69  atisfied by an i
ddb0: 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e  ndex, the origin
ddc0: 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20  al.  ** BETWEEN 
ddd0: 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e  term is skipped.
dde0: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
ddf0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
de00: 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f  ETWEEN && pWC->o
de10: 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
de20: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
de30: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
de40: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
de50: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
de60: 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45  8 ops[] = {TK_GE
de70: 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73  , TK_LE};.    as
de80: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
de90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
dea0: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b  ist->nExpr==2 );
deb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
dec0: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  2; i++){.      E
ded0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
dee0: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
def0: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
df00: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
df10: 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a  Parse, ops[i], .
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
df40: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
df50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
df60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
df80: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
df90: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
dfa0: 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  xpr, 0), 0);.   
dfb0: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
dfc0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
dfd0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
dfe0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
dff0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
e000: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
e010: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
e020: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
e030: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
e040: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
e050: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
e060: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
e070: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
e080: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
e090: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
e0a0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
e0b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
e0c0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
e0d0: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
e0e0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
e0f0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
e100: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e110: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
e120: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
e130: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
e140: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
e150: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
e160: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
e170: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
e180: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
e190: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
e1a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e1b0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
e1c0: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
e1d0: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
e1e0: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
e1f0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
e200: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
e210: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e220: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
e230: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
e240: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
e250: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
e260: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
e270: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
e280: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
e290: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
e2a0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
e2b0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
e2c0: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
e2d0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
e2e0: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
e2f0: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
e300: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
e310: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
e320: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
e330: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
e340: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
e350: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
e360: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
e370: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
e380: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
e390: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
e3a0: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
e3b0: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
e3c0: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
e3d0: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
e3e0: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
e3f0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
e400: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
e410: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
e420: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
e430: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
e440: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
e450: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
e460: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
e470: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
e480: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
e490: 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
e4a0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
e4b0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
e4c0: 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
e4d0: 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43  w2;.    Token sC
e4e0: 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20  ollSeqName;  /* 
e4f0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
e500: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
e510: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
e520: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
e530: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
e540: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e550: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
e560: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
e570: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
e580: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
e590: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
e5a0: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
e5b0: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
e5c0: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
e5d0: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
e5e0: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
e5f0: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
e600: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
e610: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
e620: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
e630: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
e640: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
e650: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
e660: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
e670: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
e680: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
e690: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
e6a0: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
e6b0: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
e6c0: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
e6d0: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
e6e0: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
e6f0: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
e700: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
e710: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
e720: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
e730: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
e740: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
e750: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
e760: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
e770: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
e780: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
e790: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
e7a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
e7b0: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
e7c0: 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f 2a 20 45  lete = 0;   /* E
e7d0: 56 3a 20 52 2d 36 34 33 33 39 2d 30 38 32 30 37  V: R-64339-08207
e7e0: 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20 63 20   */...        c 
e7f0: 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  = sqlite3UpperTo
e800: 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20  Lower[c];.      
e810: 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20  }.      *pC = c 
e820: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  + 1;.    }.    s
e830: 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a 20 3d 20  CollSeqName.z = 
e840: 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41 53 45  noCase ? "NOCASE
e850: 22 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  " : "BINARY";.  
e860: 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 6e    sCollSeqName.n
e870: 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65 77 45 78   = 6;.    pNewEx
e880: 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr1 = sqlite3Exp
e890: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
e8a0: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
e8b0: 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  1 = sqlite3PExpr
e8c0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20  (pParse, TK_GE, 
e8d0: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
e8e0: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
e8f0: 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e  eToken(pParse,pN
e900: 65 77 45 78 70 72 31 2c 26 73 43 6f 6c 6c 53 65  ewExpr1,&sCollSe
e910: 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  qName),.        
e920: 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20     pStr1, 0);.  
e930: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
e940: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
e950: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45  C, pNewExpr1, TE
e960: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
e970: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
e980: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d  stcase( idxNew1=
e990: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
e9a0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
e9b0: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
e9c0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
e9d0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
e9e0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
e9f0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
ea00: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
ea10: 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _LT,.           
ea20: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
ea30: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
ea40: 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f  e,pNewExpr2,&sCo
ea50: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
ea60: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
ea70: 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
ea80: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
ea90: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
eaa0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
eab0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
eac0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
ead0: 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew2==0 );.    ex
eae0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
eaf0: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
eb00: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
eb10: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
eb20: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
eb30: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
eb40: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
eb50: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
eb60: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
eb70: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
eb80: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
eb90: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
eba0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
ebb0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
ebc0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
ebd0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
ebe0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
ebf0: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
ec00: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
ec10: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
ec20: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
ec30: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
ec40: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
ec50: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
ec60: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
ec70: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
ec80: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
ec90: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
eca0: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
ecb0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
ecc0: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
ecd0: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
ece0: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
ecf0: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
ed00: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
ed10: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
ed20: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
ed30: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
ed40: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
ed50: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
ed60: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
ed70: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
ed80: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
ed90: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
eda0: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
edb0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
edc0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
edd0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
ede0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
edf0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
ee00: 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
ee10: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
ee20: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
ee30: 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
ee40: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
ee50: 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
ee60: 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
ee70: 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
ee80: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
ee90: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
eea0: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
eeb0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
eec0: 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
eef0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
ef00: 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
ef10: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
ef20: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
ef30: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
ef40: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
ef50: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
ef60: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ef70: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
ef80: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
ef90: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
efa0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
efb0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
efc0: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
efd0: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
efe0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
eff0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
f000: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
f010: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
f020: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
f030: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
f040: 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
f050: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
f060: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
f070: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
f080: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
f090: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
f0a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
f0b0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
f0c0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
f0d0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
f0e0: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
f0f0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
f100: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
f110: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f120: 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
f130: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
f140: 54 41 54 33 0a 20 20 2f 2a 20 57 68 65 6e 20 73  TAT3.  /* When s
f150: 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74  qlite_stat3 hist
f160: 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
f170: 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61  ailable an opera
f180: 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  tor of the.  ** 
f190: 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e  form "x IS NOT N
f1a0: 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d  ULL" can sometim
f1b0: 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  es be evaluated 
f1c0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
f1d0: 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c  .  ** as "x>NULL
f1e0: 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e  " if x is not an
f1f0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
f200: 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72   KEY.  So constr
f210: 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75  uct a.  ** virtu
f220: 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20  al term of that 
f230: 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form..  **.  ** 
f240: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69  Note that the vi
f250: 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20  rtual term must 
f260: 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54  be tagged with T
f270: 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73  ERM_VNULL.  This
f280: 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c  .  ** TERM_VNULL
f290: 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65   tag will suppre
f2a0: 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20  ss the not-null 
f2b0: 63 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67  check at the beg
f2c0: 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74  inning.  ** of t
f2d0: 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75  he loop.  Withou
f2e0: 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  t the TERM_VNULL
f2f0: 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e   flag, the not-n
f300: 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a  ull check at.  *
f310: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
f320: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65  he loop will pre
f330: 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73  vent any results
f340: 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75   from being retu
f350: 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rned..  */.  if(
f360: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
f370: 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78  OTNULL.   && pEx
f380: 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
f390: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70  K_COLUMN.   && p
f3a0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  Expr->pLeft->iCo
f3b0: 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a 20 20 20  lumn>=0.  ){.   
f3c0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
f3d0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
f3e0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
f3f0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
f400: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
f410: 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
f420: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
f430: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
f440: 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
f470: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f4a0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
f4b0: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
f4c0: 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
f4d0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
f4e0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
f4f0: 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
f520: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
f530: 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
f540: 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
f550: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
f560: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
f570: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
f580: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
f590: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
f5a0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
f5b0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
f5c0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
f5d0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
f5e0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
f5f0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
f600: 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
f610: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
f620: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
f630: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
f640: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
f650: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
f660: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
f670: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
f680: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
f690: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
f6a0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
f6b0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
f6c0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
f6d0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
f6e0: 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  STAT */..  /* Pr
f6f0: 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
f700: 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
f710: 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
f720: 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
f730: 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
f740: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
f750: 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
f760: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
f770: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
f780: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
f790: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f7a0: 73 65 61 72 63 68 65 73 20 74 68 65 20 65 78 70  searches the exp
f7b0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 61 73  ression list pas
f7c0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
f7d0: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 66 6f  d argument.** fo
f7e0: 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  r an expression 
f7f0: 6f 66 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d  of type TK_COLUM
f800: 4e 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  N that refers to
f810: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
f820: 20 61 6e 64 0a 2a 2a 20 75 73 65 73 20 74 68 65   and.** uses the
f830: 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6f 6e 20   same collation 
f840: 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20  sequence as the 
f850: 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol'th column o
f860: 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  f index pIdx..**
f870: 20 41 72 67 75 6d 65 6e 74 20 69 42 61 73 65 20   Argument iBase 
f880: 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
f890: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  mber used for th
f8a0: 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 49 64  e table that pId
f8b0: 78 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f 2e 0a  x refers.** to..
f8c0: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
f8d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
f8e0: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
f8f0: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
f900: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
f910: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
f920: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
f930: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
f940: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
f950: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
f960: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
f970: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
f980: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
f990: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f9b0: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
f9c0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
f9d0: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f9f0: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
fa00: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
fa10: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
fa20: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fa40: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
fa50: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
fa60: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa80: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
fa90: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
faa0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
fab0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
fac0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
fad0: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
fae0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
faf0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
fb00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
fb10: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
fb20: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
fb30: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
fb40: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70  COLUMN.     && p
fb50: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
fb60: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a  >aiColumn[iCol].
fb70: 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c       && p->iTabl
fb80: 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a  e==iBase.    ){.
fb90: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
fba0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
fbb0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
fbc0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
fbd0: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
fbe0: 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 26 26  ALWAYS(pColl) &&
fbf0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
fc00: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
fc10: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
fc20: 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20     return i;.   
fc30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
fc40: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
fc50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
fc60: 6e 65 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  ne determines if
fc70: 20 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65   pIdx can be use
fc80: 64 20 74 6f 20 61 73 73 69 73 74 20 69 6e 20 70  d to assist in p
fc90: 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 44  rocessing a.** D
fca0: 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
fcb0: 72 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  r. In other word
fcc0: 73 2c 20 69 74 20 74 65 73 74 73 20 77 68 65 74  s, it tests whet
fcd0: 68 65 72 20 6f 72 20 6e 6f 74 20 75 73 69 6e 67  her or not using
fce0: 20 74 68 69 73 0a 2a 2a 20 69 6e 64 65 78 20 66   this.** index f
fcf0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  or the outer loo
fd00: 70 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  p guarantees tha
fd10: 74 20 72 6f 77 73 20 77 69 74 68 20 65 71 75 61  t rows with equa
fd20: 6c 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20  l values for.** 
fd30: 61 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  all expressions 
fd40: 69 6e 20 74 68 65 20 70 44 69 73 74 69 6e 63 74  in the pDistinct
fd50: 20 6c 69 73 74 20 61 72 65 20 64 65 6c 69 76 65   list are delive
fd60: 72 65 64 20 67 72 6f 75 70 65 64 20 74 6f 67 65  red grouped toge
fd70: 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ther..**.** For 
fd80: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65  example, the que
fd90: 72 79 20 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ry .**.**   SELE
fda0: 43 54 20 44 49 53 54 49 4e 43 54 20 61 2c 20 62  CT DISTINCT a, b
fdb0: 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45  , c FROM tbl WHE
fdc0: 52 45 20 61 20 3d 20 3f 0a 2a 2a 0a 2a 2a 20 63  RE a = ?.**.** c
fdd0: 61 6e 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  an benefit from 
fde0: 61 6e 79 20 69 6e 64 65 78 20 6f 6e 20 63 6f 6c  any index on col
fdf0: 75 6d 6e 73 20 22 62 22 20 61 6e 64 20 22 63 22  umns "b" and "c"
fe00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fe10: 69 73 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28  isDistinctIndex(
fe20: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
fe30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fe40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
fe50: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
fe60: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
fe70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fe80: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
fe90: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
fec0: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
fed0: 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c  d */.  int base,
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
ff00: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
ff10: 74 61 62 6c 65 20 70 49 64 78 20 69 73 20 6f 6e  table pIdx is on
ff20: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
ff30: 70 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20  pDistinct,      
ff40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53        /* The DIS
ff50: 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e  TINCT expression
ff60: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f  s */.  int nEqCo
ff70: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
ff80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ff90: 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   of index column
ffa0: 73 20 77 69 74 68 20 3d 3d 20 2a 2f 0a 29 7b 0a  s with == */.){.
ffb0: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
ffc0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ffd0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 6e 61    /* Mask of una
ffe0: 63 63 6f 75 6e 74 65 64 20 66 6f 72 20 70 44 69  ccounted for pDi
fff0: 73 74 69 6e 63 74 20 65 78 70 72 73 20 2a 2f 0a  stinct exprs */.
10000 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
10030 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  riable */..  ass
10040 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 21 3d  ert( pDistinct!=
10050 30 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  0 );.  if( pIdx-
10060 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 69  >zName==0 || pDi
10070 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3e 3d 42  stinct->nExpr>=B
10080 4d 53 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MS ) return 0;. 
10090 20 74 65 73 74 63 61 73 65 28 20 70 44 69 73 74   testcase( pDist
100a0 69 6e 63 74 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53  inct->nExpr==BMS
100b0 2d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  -1 );..  /* Loop
100c0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65   through all the
100d0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
100e0 74 68 65 20 64 69 73 74 69 6e 63 74 20 6c 69 73  the distinct lis
100f0 74 2e 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  t. If any of the
10100 6d 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 73  m.  ** are not s
10110 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 66  imple column ref
10120 65 72 65 6e 63 65 73 2c 20 72 65 74 75 72 6e 20  erences, return 
10130 65 61 72 6c 79 2e 20 4f 74 68 65 72 77 69 73 65  early. Otherwise
10140 2c 20 74 65 73 74 20 69 66 20 74 68 65 0a 20 20  , test if the.  
10150 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
10160 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f 6c 3d  contains a "col=
10170 58 22 20 63 6c 61 75 73 65 2e 20 49 66 20 69 74  X" clause. If it
10180 20 64 6f 65 73 2c 20 74 68 65 20 65 78 70 72 65   does, the expre
10190 73 73 69 6f 6e 0a 20 20 2a 2a 20 63 61 6e 20 62  ssion.  ** can b
101a0 65 20 69 67 6e 6f 72 65 64 2e 20 49 66 20 69 74  e ignored. If it
101b0 20 64 6f 65 73 20 6e 6f 74 2c 20 61 6e 64 20 74   does not, and t
101c0 68 65 20 63 6f 6c 75 6d 6e 20 64 6f 65 73 20 6e  he column does n
101d0 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 65  ot belong to the
101e0 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
101f0 20 61 73 20 69 6e 64 65 78 20 70 49 64 78 2c 20   as index pIdx, 
10200 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 46 69  return early. Fi
10210 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 72 65 20  nally, if there 
10220 69 73 20 6e 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  is no.  ** match
10230 69 6e 67 20 22 63 6f 6c 3d 58 22 20 65 78 70 72  ing "col=X" expr
10240 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 63  ession and the c
10250 6f 6c 75 6d 6e 20 69 73 20 6f 6e 20 74 68 65 20  olumn is on the 
10260 73 61 6d 65 20 74 61 62 6c 65 20 61 73 20 70 49  same table as pI
10270 64 78 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  dx,.  ** set the
10280 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
10290 69 74 20 69 6e 20 76 61 72 69 61 62 6c 65 20 6d  it in variable m
102a0 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ask..  */.  for(
102b0 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
102c0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
102d0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
102e0 65 72 6d 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  erm;.    Expr *p
102f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
10300 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69  ipCollate(pDisti
10310 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  nct->a[i].pExpr)
10320 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21  ;.    if( p->op!
10330 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
10340 75 72 6e 20 30 3b 0a 20 20 20 20 70 54 65 72 6d  urn 0;.    pTerm
10350 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
10360 20 70 2d 3e 69 54 61 62 6c 65 2c 20 70 2d 3e 69   p->iTable, p->i
10370 43 6f 6c 75 6d 6e 2c 20 7e 28 42 69 74 6d 61 73  Column, ~(Bitmas
10380 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a  k)0, WO_EQ, 0);.
10390 20 20 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b      if( pTerm ){
103a0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20  .      Expr *pX 
103b0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
103c0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
103d0 31 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  1 = sqlite3Binar
103e0 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
103f0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
10400 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
10410 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
10420 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
10430 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 31 3d  );.      if( p1=
10450 3d 70 32 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =p2 ) continue;.
10460 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
10470 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29 20  >iTable!=base ) 
10480 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d 61  return 0;.    ma
10490 73 6b 20 7c 3d 20 28 28 28 42 69 74 6d 61 73 6b  sk |= (((Bitmask
104a0 29 31 29 20 3c 3c 20 69 29 3b 0a 20 20 7d 0a 0a  )1) << i);.  }..
104b0 20 20 66 6f 72 28 69 3d 6e 45 71 43 6f 6c 3b 20    for(i=nEqCol; 
104c0 6d 61 73 6b 20 26 26 20 69 3c 70 49 64 78 2d 3e  mask && i<pIdx->
104d0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
104e0 20 20 20 69 6e 74 20 69 45 78 70 72 20 3d 20 66     int iExpr = f
104f0 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72  indIndexCol(pPar
10500 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 62  se, pDistinct, b
10510 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20  ase, pIdx, i);. 
10520 20 20 20 69 66 28 20 69 45 78 70 72 3c 30 20 29     if( iExpr<0 )
10530 20 62 72 65 61 6b 3b 0a 20 20 20 20 6d 61 73 6b   break;.    mask
10540 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29   &= ~(((Bitmask)
10550 31 29 20 3c 3c 20 69 45 78 70 72 29 3b 0a 20 20  1) << iExpr);.  
10560 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 6d 61 73  }..  return (mas
10570 6b 3d 3d 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  k==0);.}.../*.**
10580 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
10590 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70  the DISTINCT exp
105a0 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73  ression-list pas
105b0 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64  sed as the third
105c0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
105d0 72 65 64 75 6e 64 61 6e 74 2e 20 41 20 44 49 53  redundant. A DIS
105e0 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65  TINCT list is re
105f0 64 75 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64  dundant if the d
10600 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73  atabase contains
10610 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 69 6e 64   a.** UNIQUE ind
10620 65 78 20 74 68 61 74 20 67 75 61 72 61 6e 74 65  ex that guarante
10630 65 73 20 74 68 61 74 20 74 68 65 20 72 65 73 75  es that the resu
10640 6c 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  lt of the query 
10650 77 69 6c 6c 20 62 65 20 64 69 73 74 69 6e 63 74  will be distinct
10660 0a 2a 2a 20 61 6e 79 77 61 79 2e 0a 2a 2f 0a 73  .** anyway..*/.s
10670 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
10680 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
10690 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
106a0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
106b0 69 73 74 2c 0a 20 20 57 68 65 72 65 43 6c 61 75  ist,.  WhereClau
106c0 73 65 20 2a 70 57 43 2c 0a 20 20 45 78 70 72 4c  se *pWC,.  ExprL
106d0 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 0a 29  ist *pDistinct.)
106e0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
106f0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
10700 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a    .  int iBase;.
10730 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
10740 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
10750 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c  table or sub-sel
10760 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ect in the FROM 
10770 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74  clause of.  ** t
10780 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20  his query, then 
10790 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
107a0 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20  ossible to show 
107b0 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
107c0 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69  T .  ** clause i
107d0 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a  s redundant. */.
107e0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
107f0 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
10800 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54   0;.  iBase = pT
10810 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
10820 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70  rsor;.  pTab = p
10830 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54  TabList->a[0].pT
10840 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79  ab;..  /* If any
10850 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
10860 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f  ons is an IPK co
10870 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42  lumn on table iB
10880 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ase, then return
10890 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74   .  ** true. Not
108a0 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c  e: The (p->iTabl
108b0 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f  e==iBase) part o
108c0 66 20 74 68 69 73 20 74 65 73 74 20 6d 61 79 20  f this test may 
108d0 62 65 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a  be false if the.
108e0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c    ** current SEL
108f0 45 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ECT is a correla
10900 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  ted sub-query.. 
10910 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
10920 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70  <pDistinct->nExp
10930 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
10940 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
10950 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44  prSkipCollate(pD
10960 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45  istinct->a[i].pE
10970 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
10980 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
10990 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
109a0 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  se && p->iColumn
109b0 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
109c0 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68   }..  /* Loop th
109d0 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65  rough all indice
109e0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  s on the table, 
109f0 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f  checking each to
10a00 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73   see if it makes
10a10 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e  .  ** the DISTIN
10a20 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65 64  CT qualifier red
10a30 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20  undant. It does 
10a40 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  so if:.  **.  **
10a50 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20     1. The index 
10a60 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45  is itself UNIQUE
10a70 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20  , and.  **.  ** 
10a80 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20    2. All of the 
10a90 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
10aa0 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72 20  ndex are either 
10ab0 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69 73  part of the pDis
10ac0 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20  tinct.  **      
10ad0 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68  list, or else th
10ae0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
10af0 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f  ontains a term o
10b00 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d  f the form "col=
10b10 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68  X",.  **      wh
10b20 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74  ere X is a const
10b30 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63  ant value. The c
10b40 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
10b50 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20  es of the.  **  
10b60 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61      comparison a
10b70 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65  nd select-list e
10b80 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
10b90 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74  match those of t
10ba0 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  he index..  **. 
10bb0 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20   **   3. All of 
10bc0 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c 75  those index colu
10bd0 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  mns for which th
10be0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  e WHERE clause d
10bf0 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20  oes not.  **    
10c00 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c    contain a "col
10c10 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73 75 62  =X" term are sub
10c20 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55  ject to a NOT NU
10c30 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  LL constraint.. 
10c40 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70   */.  for(pIdx=p
10c50 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
10c60 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
10c70 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
10c80 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
10c90 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  None ) continue;
10ca0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10cb0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
10cc0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
10cd0 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
10ce0 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69  lumn[i];.      i
10cf0 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70  f( 0==findTerm(p
10d00 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c  WC, iBase, iCol,
10d10 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
10d20 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
10d30 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f        int iIdxCo
10d40 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  l = findIndexCol
10d50 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
10d60 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
10d70 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
10d80 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54   iIdxCol<0 || pT
10d90 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  ab->aCol[pIdx->a
10da0 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e  iColumn[i]].notN
10db0 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
10dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10dd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10de0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49   }.    if( i==pI
10df0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
10e00 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
10e10 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  ex implies that 
10e20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
10e30 6c 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64  lifier is redund
10e40 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ant. */.      re
10e50 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
10e60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
10e70 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
10e80 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65  a crude estimate
10e90 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68   of the logarith
10ea0 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
10eb0 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  alue..** The res
10ec0 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65  ults need not be
10ed0 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73   exact.  This is
10ee0 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65   only used for e
10ef0 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65  stimating.** the
10f00 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70   total cost of p
10f10 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74  erforming operat
10f20 69 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e  ions with O(logN
10f30 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a  ) or O(NlogN).**
10f40 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65   complexity.  Be
10f50 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20  cause N is just 
10f60 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e  a guess, it is n
10f70 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20  o great tragedy 
10f80 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20  if.** logN is a 
10f90 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73  little off..*/.s
10fa0 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74  tatic double est
10fb0 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20  Log(double N){. 
10fc0 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31   double logN = 1
10fd0 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31  ;.  double x = 1
10fe0 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20  0;.  while( N>x 
10ff0 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31  ){.    logN += 1
11000 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20  ;.    x *= 10;. 
11010 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e   }.  return logN
11020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  ;.}../*.** Two r
11030 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
11040 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
11050 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
11060 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
11070 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
11080 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
11090 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
110a0 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
110b0 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
110c0 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
110d0 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
110e0 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
110f0 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
11100 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11110 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11120 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
11130 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
11140 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
11150 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
11160 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
11170 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
11180 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
11190 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
111a0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
111b0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
111c0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
111d0 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
111e0 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
111f0 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
11200 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
11210 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
11220 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
11230 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
11240 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
11250 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
11260 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
11270 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
11280 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
11290 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
112a0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
112b0 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
112c0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
112d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
112e0 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
112f0 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
11300 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
11310 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
11320 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
11330 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
11340 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
11350 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
11360 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
11370 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
11380 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
11390 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
113a0 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
113b0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
113c0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
113d0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
113e0 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
113f0 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
11400 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
11410 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
11420 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
11430 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
11440 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
11450 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
11460 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
11470 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
11480 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
11490 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
114a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
114b0 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
114c0 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
114d0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
114e0 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
114f0 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
11500 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
11510 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
11520 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
11530 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
11540 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
11550 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
11560 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
11570 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (A).#define TRAC
11580 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29  E_IDX_OUTPUTS(A)
11590 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
115a0 52 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  Required because
115b0 20 62 65 73 74 49 6e 64 65 78 28 29 20 69 73 20   bestIndex() is 
115c0 63 61 6c 6c 65 64 20 62 79 20 62 65 73 74 4f 72  called by bestOr
115d0 43 6c 61 75 73 65 49 6e 64 65 78 28 29 20 0a 2a  ClauseIndex() .*
115e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
115f0 73 74 49 6e 64 65 78 28 57 68 65 72 65 42 65 73  stIndex(WhereBes
11600 74 49 64 78 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  tIdx*);../*.** T
11610 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
11620 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 61 6e 20  mpts to find an 
11630 73 63 61 6e 6e 69 6e 67 20 73 74 72 61 74 65 67  scanning strateg
11640 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  y that can be us
11650 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74 69 6d 69  ed .** to optimi
11660 7a 65 20 61 6e 20 27 4f 52 27 20 65 78 70 72 65  ze an 'OR' expre
11670 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61  ssion that is pa
11680 72 74 20 6f 66 20 61 20 57 48 45 52 45 20 63 6c  rt of a WHERE cl
11690 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ause. .**.** The
116a0 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
116b0 64 20 77 69 74 68 20 46 52 4f 4d 20 63 6c 61 75  d with FROM clau
116c0 73 65 20 74 65 72 6d 20 70 53 72 63 20 6d 61 79  se term pSrc may
116d0 20 62 65 20 65 69 74 68 65 72 20 61 0a 2a 2a 20   be either a.** 
116e0 72 65 67 75 6c 61 72 20 42 2d 54 72 65 65 20 74  regular B-Tree t
116f0 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74 75 61  able or a virtua
11700 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
11710 69 63 20 76 6f 69 64 20 62 65 73 74 4f 72 43 6c  ic void bestOrCl
11720 61 75 73 65 49 6e 64 65 78 28 57 68 65 72 65 42  auseIndex(WhereB
11730 65 73 74 49 64 78 20 2a 70 29 7b 0a 23 69 66 6e  estIdx *p){.#ifn
11740 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11750 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
11760 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
11770 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20 20 20  WC = p->pWC;    
11780 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
11790 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
117a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
117b0 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  tem *pSrc = p->p
117c0 53 72 63 3b 20 2f 2a 20 54 68 65 20 46 52 4f 4d  Src; /* The FROM
117d0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
117e0 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73  search */.  cons
117f0 74 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72  t int iCur = pSr
11800 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 20 20  c->iCursor;     
11810 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
11820 66 20 74 68 65 20 74 61 62 6c 65 20 20 2a 2f 0a  f the table  */.
11830 20 20 63 6f 6e 73 74 20 42 69 74 6d 61 73 6b 20    const Bitmask 
11840 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d 61 73  maskSrc = getMas
11850 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
11860 20 69 43 75 72 29 3b 20 20 2f 2a 20 42 69 74 6d   iCur);  /* Bitm
11870 61 73 6b 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a  ask for pSrc */.
11880 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
11890 6e 73 74 20 70 57 43 45 6e 64 20 3d 20 26 70 57  nst pWCEnd = &pW
118a0 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
118b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
118c0 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
118d0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
118e0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
118f0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
11900 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
11910 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20  ERE clause */.. 
11920 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73   /* The OR-claus
11930 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
11940 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 69 66 20  s disallowed if 
11950 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 6f  the INDEXED BY o
11960 72 0a 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58  r.  ** NOT INDEX
11970 45 44 20 63 6c 61 75 73 65 73 20 61 72 65 20 75  ED clauses are u
11980 73 65 64 20 6f 72 20 69 66 20 74 68 65 20 57 48  sed or if the WH
11990 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 62 69 74  ERE_AND_ONLY bit
119a0 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69 66   is set. */.  if
119b0 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
119c0 65 64 20 7c 7c 20 70 53 72 63 2d 3e 70 49 6e 64  ed || pSrc->pInd
119d0 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ex!=0 ){.    ret
119e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
119f0 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  WC->wctrlFlags &
11a00 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
11a10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
11a20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
11a30 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
11a40 20 74 65 72 6d 73 20 66 6f 72 20 61 20 75 73 61   terms for a usa
11a50 62 6c 65 20 57 4f 5f 4f 52 20 74 65 72 6d 2e 20  ble WO_OR term. 
11a60 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  */.  for(pTerm=p
11a70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
11a80 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
11a90 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
11aa0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
11ab0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 28 70  )!=0.     && ((p
11ac0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
11ad0 26 20 7e 6d 61 73 6b 53 72 63 29 20 26 20 70 2d  & ~maskSrc) & p-
11ae0 3e 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20  >notReady)==0.  
11af0 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
11b00 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
11b10 6c 65 20 26 20 6d 61 73 6b 53 72 63 29 21 3d 30  le & maskSrc)!=0
11b20 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
11b30 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
11b40 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
11b50 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
11b60 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
11b70 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
11b80 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
11b90 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
11ba0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
11bb0 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 64 6f  OrTerm;.      do
11bc0 75 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b  uble rTotal = 0;
11bd0 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6e 52  .      double nR
11be0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 42 69  ow = 0;.      Bi
11bf0 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a  tmask used = 0;.
11c00 20 20 20 20 20 20 57 68 65 72 65 42 65 73 74 49        WhereBestI
11c10 64 78 20 73 42 4f 49 3b 0a 0a 20 20 20 20 20 20  dx sBOI;..      
11c20 73 42 4f 49 20 3d 20 2a 70 3b 0a 20 20 20 20 20  sBOI = *p;.     
11c30 20 73 42 4f 49 2e 70 4f 72 64 65 72 42 79 20 3d   sBOI.pOrderBy =
11c40 20 30 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e 70   0;.      sBOI.p
11c50 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
11c60 20 20 20 20 73 42 4f 49 2e 70 70 49 64 78 49 6e      sBOI.ppIdxIn
11c70 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  fo = 0;.      fo
11c80 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
11c90 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
11ca0 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
11cb0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 57 48 45 52  {.        /*WHER
11cc0 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c  ETRACE(("... Mul
11cd0 74 69 2d 69 6e 64 65 78 20 4f 52 20 74 65 73 74  ti-index OR test
11ce0 69 6e 67 20 66 6f 72 20 74 65 72 6d 20 25 64 20  ing for term %d 
11cf0 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20  of %d....\n", . 
11d00 20 20 20 20 20 20 20 20 20 28 70 4f 72 54 65 72           (pOrTer
11d10 6d 20 2d 20 70 4f 72 57 43 2d 3e 61 29 2c 20 28  m - pOrWC->a), (
11d20 70 54 65 72 6d 20 2d 20 70 57 43 2d 3e 61 29 0a  pTerm - pWC->a).
11d30 20 20 20 20 20 20 20 20 29 29 3b 2a 2f 0a 20 20          ));*/.  
11d40 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
11d50 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 20 57  rm->eOperator& W
11d60 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
11d70 20 20 20 20 20 20 20 73 42 4f 49 2e 70 57 43 20         sBOI.pWC 
11d80 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
11d90 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
11da0 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28        bestIndex(
11db0 26 73 42 4f 49 29 3b 0a 20 20 20 20 20 20 20 20  &sBOI);.        
11dc0 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
11dd0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
11de0 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
11df0 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
11e00 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
11e10 65 6d 70 57 43 2e 70 50 61 72 73 65 20 3d 20 70  empWC.pParse = p
11e20 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  WC->pParse;.    
11e30 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4d 61        tempWC.pMa
11e40 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
11e50 73 6b 53 65 74 3b 0a 20 20 20 20 20 20 20 20 20  skSet;.         
11e60 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d   tempWC.pOuter =
11e70 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pWC;.          
11e80 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
11e90 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ND;.          te
11ea0 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d  mpWC.a = pOrTerm
11eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
11ec0 57 43 2e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  WC.wctrlFlags = 
11ed0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  0;.          tem
11ee0 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
11ef0 20 20 20 20 20 20 20 20 20 73 42 4f 49 2e 70 57           sBOI.pW
11f00 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20  C = &tempWC;.   
11f10 20 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78         bestIndex
11f20 28 26 73 42 4f 49 29 3b 0a 20 20 20 20 20 20 20  (&sBOI);.       
11f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11f40 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
11f50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 54      }.        rT
11f60 6f 74 61 6c 20 2b 3d 20 73 42 4f 49 2e 63 6f 73  otal += sBOI.cos
11f70 74 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  t.rCost;.       
11f80 20 6e 52 6f 77 20 2b 3d 20 73 42 4f 49 2e 63 6f   nRow += sBOI.co
11f90 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20  st.plan.nRow;.  
11fa0 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 73 42        used |= sB
11fb0 4f 49 2e 63 6f 73 74 2e 75 73 65 64 3b 0a 20 20  OI.cost.used;.  
11fc0 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c        if( rTotal
11fd0 3e 3d 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20  >=p->cost.rCost 
11fe0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
11ff0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
12000 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
12010 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65  BY clause, incre
12020 61 73 65 20 74 68 65 20 73 63 61 6e 20 63 6f 73  ase the scan cos
12030 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 0a 20 20  t to account .  
12040 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63      ** for the c
12050 6f 73 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2e  ost of the sort.
12060 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
12070 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 7b 0a  >pOrderBy!=0 ){.
12080 20 20 20 20 20 20 20 20 2f 2a 57 48 45 52 45 54          /*WHERET
12090 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69  RACE(("... sorti
120a0 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f 52 20  ng increases OR 
120b0 63 6f 73 74 20 25 2e 39 67 20 74 6f 20 25 2e 39  cost %.9g to %.9
120c0 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  g\n",.          
120d0 20 20 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c            rTotal
120e0 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a 65 73  , rTotal+nRow*es
120f0 74 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 2a 2f 0a  tLog(nRow)));*/.
12100 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b          rTotal +
12110 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52  = nRow*estLog(nR
12120 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ow);.      }..  
12130 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
12140 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75  st of scanning u
12150 73 69 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72  sing this OR ter
12160 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  m for optimizati
12170 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  on is.      ** l
12180 65 73 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ess than the cur
12190 72 65 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64  rent cost stored
121a0 20 69 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61   in pCost, repla
121b0 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ce the contents.
121c0 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73        ** of pCos
121d0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 57 48  t. */.      /*WH
121e0 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d  ERETRACE(("... m
121f0 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f  ulti-index OR co
12200 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39  st=%.9g nrow=%.9
12210 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52  g\n", rTotal, nR
12220 6f 77 29 29 3b 2a 2f 0a 20 20 20 20 20 20 69 66  ow));*/.      if
12230 28 20 72 54 6f 74 61 6c 3c 70 2d 3e 63 6f 73 74  ( rTotal<p->cost
12240 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  .rCost ){.      
12250 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20    p->cost.rCost 
12260 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = rTotal;.      
12270 20 20 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 3d    p->cost.used =
12280 20 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20 70   used;.        p
12290 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77  ->cost.plan.nRow
122a0 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20   = nRow;.       
122b0 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f   p->cost.plan.nO
122c0 42 53 61 74 20 3d 20 70 2d 3e 69 20 3f 20 70 2d  BSat = p->i ? p-
122d0 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e  >aLevel[p->i-1].
122e0 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3a 20 30 3b  plan.nOBSat : 0;
122f0 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  .        p->cost
12300 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20  .plan.wsFlags = 
12310 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
12320 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e          p->cost.
12330 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20 3d 20 70  plan.u.pTerm = p
12340 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
12350 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
12360 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
12370 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
12380 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
12390 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
123a0 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65  C_INDEX./*.** Re
123b0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
123c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
123d0 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61  rm pTerm is of a
123e0 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a   form where it.*
123f0 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  * could be used 
12400 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f  with an index to
12410 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73   access pSrc, as
12420 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70  suming an approp
12430 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65  riate.** index e
12440 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  xisted..*/.stati
12450 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69  c int termCanDri
12460 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  veIndex(.  Where
12470 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20  Term *pTerm,    
12480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
12490 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
124a0 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72  o check */.  str
124b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
124c0 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
124d0 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69  able we are tryi
124e0 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ng to access */.
124f0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
12500 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
12510 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75   /* Tables in ou
12520 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65  ter loops of the
12530 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68   join */.){.  ch
12540 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54  ar aff;.  if( pT
12550 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
12560 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
12570 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
12580 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
12590 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29  or & WO_EQ)==0 )
125a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
125b0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
125c0 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
125d0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
125e0 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54    aff = pSrc->pT
125f0 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e  ab->aCol[pTerm->
12600 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66  u.leftColumn].af
12610 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73  finity;.  if( !s
12620 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
12630 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
12640 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72  pr, aff) ) retur
12650 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
12660 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
12670 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12680 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
12690 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72  *.** If the quer
126a0 79 20 70 6c 61 6e 20 66 6f 72 20 70 53 72 63 20  y plan for pSrc 
126b0 73 70 65 63 69 66 69 65 64 20 69 6e 20 70 43 6f  specified in pCo
126c0 73 74 20 69 73 20 61 20 66 75 6c 6c 20 74 61 62  st is a full tab
126d0 6c 65 20 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69  le scan.** and i
126e0 6e 64 65 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77  ndexing is allow
126f0 73 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6e  s (if there is n
12700 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  o NOT INDEXED cl
12710 61 75 73 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20  ause) and it.** 
12720 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73  possible to cons
12730 74 72 75 63 74 20 61 20 74 72 61 6e 73 69 65 6e  truct a transien
12740 74 20 69 6e 64 65 78 20 74 68 61 74 20 77 6f 75  t index that wou
12750 6c 64 20 70 65 72 66 6f 72 6d 20 62 65 74 74 65  ld perform bette
12760 72 0a 2a 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c  r.** than a full
12770 20 74 61 62 6c 65 20 73 63 61 6e 20 65 76 65 6e   table scan even
12780 20 77 68 65 6e 20 74 68 65 20 63 6f 73 74 20 6f   when the cost o
12790 66 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  f constructing t
127a0 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74  he index.** is t
127b0 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e  aken into accoun
127c0 74 2c 20 74 68 65 6e 20 61 6c 74 65 72 20 74 68  t, then alter th
127d0 65 20 71 75 65 72 79 20 70 6c 61 6e 20 74 6f 20  e query plan to 
127e0 75 73 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  use the.** trans
127f0 69 65 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  ient index..*/.s
12800 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 41  tatic void bestA
12810 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 57 68  utomaticIndex(Wh
12820 65 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a  ereBestIdx *p){.
12830 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
12840 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  = p->pParse;    
12850 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
12860 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12870 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
12880 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20  *pWC = p->pWC;  
12890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
128a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
128b0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
128c0 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70  t_item *pSrc = p
128d0 2d 3e 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20  ->pSrc;  /* The 
128e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
128f0 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
12900 64 6f 75 62 6c 65 20 6e 54 61 62 6c 65 52 6f 77  double nTableRow
12910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12920 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e        /* Rows in
12930 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65   the input table
12940 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67   */.  double log
12950 4e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N;              
12960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
12970 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29 20 2a 2f  og(nTableRow) */
12980 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 54 65  .  double costTe
12990 6d 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f  mpIdx;         /
129a0 2a 20 70 65 72 2d 71 75 65 72 79 20 63 6f 73 74  * per-query cost
129b0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 65 6e   of the transien
129c0 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  t index */.  Whe
129d0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
129e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
129f0 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
12a00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
12a10 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
12a20 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
12a30 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
12a40 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  ] */.  Table *pT
12a50 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
12a60 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 74 20     /* Table tht 
12a70 6d 69 67 68 74 20 62 65 20 69 6e 64 65 78 65 64  might be indexed
12a80 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73   */..  if( pPars
12a90 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3c 3d 28  e->nQueryLoop<=(
12aa0 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20 20 20  double)1 ){.    
12ab0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70  /* There is no p
12ac0 6f 69 6e 74 20 69 6e 20 62 75 69 6c 64 69 6e 67  oint in building
12ad0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
12ae0 64 65 78 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  dex for a single
12af0 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74   scan */.    ret
12b00 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  urn;.  }.  if( (
12b10 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
12b20 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s & SQLITE_AutoI
12b30 6e 64 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ndex)==0 ){.    
12b40 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
12b50 69 63 65 73 20 61 72 65 20 64 69 73 61 62 6c 65  ices are disable
12b60 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 2a 2f  d at run-time */
12b70 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
12b80 0a 20 20 69 66 28 20 28 70 2d 3e 63 6f 73 74 2e  .  if( (p->cost.
12b90 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
12ba0 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
12bb0 4e 29 21 3d 30 0a 20 20 20 26 26 20 28 70 2d 3e  N)!=0.   && (p->
12bc0 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
12bd0 73 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f  s & WHERE_COVER_
12be0 53 43 41 4e 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  SCAN)==0.  ){.  
12bf0 20 20 2f 2a 20 57 65 20 61 6c 72 65 61 64 79 20    /* We already 
12c00 68 61 76 65 20 73 6f 6d 65 20 6b 69 6e 64 20 6f  have some kind o
12c10 66 20 69 6e 64 65 78 20 69 6e 20 75 73 65 20 66  f index in use f
12c20 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 20 2a  or this query. *
12c30 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
12c40 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 76 69  }.  if( pSrc->vi
12c50 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
12c60 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 69 6e 64 65    /* Cannot inde
12c70 78 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  x a co-routine *
12c80 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
12c90 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f  }.  if( pSrc->no
12ca0 74 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20  tIndexed ){.    
12cb0 2f 2a 20 54 68 65 20 4e 4f 54 20 49 4e 44 45 58  /* The NOT INDEX
12cc0 45 44 20 63 6c 61 75 73 65 20 61 70 70 65 61 72  ED clause appear
12cd0 73 20 69 6e 20 74 68 65 20 53 51 4c 2e 20 2a 2f  s in the SQL. */
12ce0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
12cf0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 69 73 43  .  if( pSrc->isC
12d00 6f 72 72 65 6c 61 74 65 64 20 29 7b 0a 20 20 20  orrelated ){.   
12d10 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20 69   /* The source i
12d20 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
12d30 75 62 2d 71 75 65 72 79 2e 20 4e 6f 20 70 6f 69  ub-query. No poi
12d40 6e 74 20 69 6e 20 69 6e 64 65 78 69 6e 67 20 69  nt in indexing i
12d50 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  t. */.    return
12d60 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
12d70 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
12d80 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65 29 31  oop >= (double)1
12d90 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   );.  pTable = p
12da0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 6e 54 61  Src->pTab;.  nTa
12db0 62 6c 65 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d  bleRow = pTable-
12dc0 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 6c 6f 67 4e  >nRowEst;.  logN
12dd0 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62 6c 65   = estLog(nTable
12de0 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65 6d 70  Row);.  costTemp
12df0 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54  Idx = 2*logN*(nT
12e00 61 62 6c 65 52 6f 77 2f 70 50 61 72 73 65 2d 3e  ableRow/pParse->
12e10 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31 29 3b  nQueryLoop + 1);
12e20 0a 20 20 69 66 28 20 63 6f 73 74 54 65 6d 70 49  .  if( costTempI
12e30 64 78 3e 3d 70 2d 3e 63 6f 73 74 2e 72 43 6f 73  dx>=p->cost.rCos
12e40 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  t ){.    /* The 
12e50 63 6f 73 74 20 6f 66 20 63 72 65 61 74 69 6e 67  cost of creating
12e60 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
12e70 61 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 67 72  able would be gr
12e80 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  eater than.    *
12e90 2a 20 64 6f 69 6e 67 20 74 68 65 20 66 75 6c 6c  * doing the full
12ea0 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
12eb0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
12ec0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
12ed0 61 6e 79 20 65 71 75 61 6c 69 74 79 20 63 6f 6d  any equality com
12ee0 70 61 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a  parison term */.
12ef0 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d    pWCEnd = &pWC-
12f00 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  >a[pWC->nTerm];.
12f10 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
12f20 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
12f30 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
12f40 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
12f50 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
12f60 63 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 29 20  c, p->notReady) 
12f70 29 7b 0a 20 20 20 20 20 20 2f 2a 57 48 45 52 45  ){.      /*WHERE
12f80 54 52 41 43 45 28 28 22 61 75 74 6f 2d 69 6e 64  TRACE(("auto-ind
12f90 65 78 20 72 65 64 75 63 65 73 20 63 6f 73 74 20  ex reduces cost 
12fa0 66 72 6f 6d 20 25 2e 31 66 20 74 6f 20 25 2e 31  from %.1f to %.1
12fb0 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  f\n",.          
12fc0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73            p->cos
12fd0 74 2e 72 43 6f 73 74 2c 20 63 6f 73 74 54 65 6d  t.rCost, costTem
12fe0 70 49 64 78 29 29 3b 2a 2f 0a 20 20 20 20 20 20  pIdx));*/.      
12ff0 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20  p->cost.rCost = 
13000 63 6f 73 74 54 65 6d 70 49 64 78 3b 0a 20 20 20  costTempIdx;.   
13010 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e     p->cost.plan.
13020 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20 31 3b  nRow = logN + 1;
13030 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70  .      p->cost.p
13040 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48  lan.wsFlags = WH
13050 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ERE_TEMP_INDEX;.
13060 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 75 73        p->cost.us
13070 65 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ed = pTerm->prer
13080 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62  eqRight;.      b
13090 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
130a0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
130b0 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e   bestAutomaticIn
130c0 64 65 78 28 41 29 20 20 2f 2a 20 6e 6f 2d 6f 70  dex(A)  /* no-op
130d0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   */.#endif /* SQ
130e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
130f0 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23  TIC_INDEX */...#
13100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13110 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
13120 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  EX./*.** Generat
13130 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72  e code to constr
13140 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
13150 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f  ject for an auto
13160 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61  matic index.** a
13170 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  nd to set up the
13180 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65   WhereLevel obje
13190 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61  ct pLevel so tha
131a0 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
131b0 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73  ator.** makes us
131c0 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74  e of the automat
131d0 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ic index..*/.sta
131e0 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75  tic void constru
131f0 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
13200 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13210 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
13220 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
13230 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
13240 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
13250 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
13260 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
13270 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
13280 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
13290 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
132a0 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20  term to get the 
132b0 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  next index */.  
132c0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
132d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
132e0 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
132f0 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
13300 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
13310 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20  Level *pLevel   
13320 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
13330 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a  new index here *
13340 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  /.){.  int nColu
13350 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
13360 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13370 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
13380 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78  onstructed index
13390 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
133a0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
133b0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
133c0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
133d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
133e0 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
133f0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
13400 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
13410 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
13420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
13430 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  yte of memory ne
13440 65 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f  eded for pIdx */
13450 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13470 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
13480 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
13490 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
134a0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
134b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
134c0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
134d0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
134e0 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  n */.  int addrI
134f0 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
13500 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13510 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
13520 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20  ion bypass jump 
13530 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
13540 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
13550 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
13560 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  ing indexed */. 
13570 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e   KeyInfo *pKeyin
13580 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
13590 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
135a0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
135b0 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f     .  int addrTo
135c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
135d0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
135e0 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20  index fill loop 
135f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
13600 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
13610 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
13620 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65  ding an index re
13630 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
13660 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
13670 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
13680 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
13690 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
136a0 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20  t mxBitCol;     
136b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
136c0 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  imum column in p
136d0 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a  Src->colUsed */.
136e0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
136f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13700 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
13710 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
13720 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  mn */.  Bitmask 
13730 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
13740 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
13750 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
13760 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
13770 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
13780 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
13790 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
137a0 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a  nal columns */..
137b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
137c0 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20  de to skip over 
137d0 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64  the creation and
137e0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
137f0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  of the.  ** tran
13800 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32  sient index on 2
13810 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
13820 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20  t iterations of 
13830 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76  the loop. */.  v
13840 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
13850 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
13860 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d   );.  addrInit =
13870 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
13880 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
13890 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
138a0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
138b0 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
138c0 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
138d0 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
138e0 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
138f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
13900 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20   nColumn = 0;.  
13910 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
13920 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
13930 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
13940 72 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  rm];.  idxCols =
13950 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
13960 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
13970 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
13980 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
13990 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
139a0 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
139b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
139c0 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
139d0 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
139e0 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
139f0 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69  iCol>=BMS ? ((Bi
13a00 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
13a10 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29  ) : ((Bitmask)1)
13a20 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65  <<iCol;.      te
13a30 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
13a40 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
13a50 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
13a60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
13a70 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
13a80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43  =0 ){.        nC
13a90 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
13aa0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
13ab0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13ac0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13ad0 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
13ae0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d  evel->plan.nEq =
13af0 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20   nColumn;..  /* 
13b00 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
13b10 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
13b20 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
13b30 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63   create a.  ** c
13b40 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
13b50 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  A "covering inde
13b60 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  x" is an index t
13b70 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
13b80 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  .  ** columns th
13b90 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  at are needed by
13ba0 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74   the query.  Wit
13bb0 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  h a covering ind
13bc0 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69  ex, the.  ** ori
13bd0 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65  ginal table neve
13be0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63  r needs to be ac
13bf0 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74  cessed.  Automat
13c00 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a  ic indices must.
13c10 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69    ** be a coveri
13c20 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65  ng index because
13c30 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
13c40 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69  not be updated i
13c50 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  f the.  ** origi
13c60 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65  nal table change
13c70 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
13c80 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  and table cannot
13c90 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20   both be used.  
13ca0 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75  ** if they go ou
13cb0 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a  t of sync..  */.
13cc0 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53    extraCols = pS
13cd0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e  rc->colUsed & (~
13ce0 69 64 78 43 6f 6c 73 20 7c 20 28 28 28 42 69 74  idxCols | (((Bit
13cf0 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
13d00 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
13d10 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e   (pTable->nCol >
13d20 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31  = BMS-1) ? BMS-1
13d30 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   : pTable->nCol;
13d40 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
13d50 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
13d60 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
13d70 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
13d80 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
13d90 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
13da0 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
13db0 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61  aCols & (((Bitma
13dc0 73 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c  sk)1)<<i) ) nCol
13dd0 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  umn++;.  }.  if(
13de0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
13df0 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
13e00 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20  (BMS-1)) ){.    
13e10 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c  nColumn += pTabl
13e20 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
13e30 31 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d  1;.  }.  pLevel-
13e40 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  >plan.wsFlags |=
13e50 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
13e60 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
13e70 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  Y;..  /* Constru
13e80 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
13e90 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
13ea0 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
13eb0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49  nByte = sizeof(I
13ec0 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b  ndex);.  nByte +
13ed0 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
13ee0 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e  (int);     /* In
13ef0 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a  dex.aiColumn */.
13f00 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
13f10 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  mn*sizeof(char*)
13f20 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43  ;   /* Index.azC
13f30 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  oll */.  nByte +
13f40 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  = nColumn;      
13f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13f60 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
13f70 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
13f80 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
13f90 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65  Parse->db, nByte
13fa0 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
13fb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 65   ) return;.  pLe
13fc0 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
13fd0 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d   = pIdx;.  pIdx-
13fe0 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
13ff0 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20 70 49  *)&pIdx[1];.  pI
14000 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  dx->aiColumn = (
14010 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a 43 6f  int*)&pIdx->azCo
14020 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70  ll[nColumn];.  p
14030 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Idx->aSortOrder 
14040 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e 61 69  = (u8*)&pIdx->ai
14050 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b  Column[nColumn];
14060 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
14070 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
14080 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
14090 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49 64 78   nColumn;.  pIdx
140a0 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  ->pTable = pTabl
140b0 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64  e;.  n = 0;.  id
140c0 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
140d0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
140e0 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
140f0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
14100 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
14110 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
14120 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
14130 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
14140 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
14150 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
14160 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
14170 20 3f 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ? ((Bitmask)1)<
14180 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28 42 69 74  <(BMS-1) : ((Bit
14190 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a 20  mask)1)<<iCol;. 
141a0 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
141b0 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
141c0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
141d0 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
141e0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
141f0 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
14200 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
14210 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75  mn[n] = pTerm->u
14220 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
14230 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
14240 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
14250 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
14260 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
14270 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
14280 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
14290 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29   = ALWAYS(pColl)
142a0 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
142b0 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  : "BINARY";.    
142c0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
142d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
142e0 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 65  ert( (u32)n==pLe
142f0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 29 3b  vel->plan.nEq );
14300 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74  ..  /* Add addit
14310 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
14320 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  eded to make the
14330 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
14340 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76   into.  ** a cov
14350 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
14360 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
14370 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
14380 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
14390 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69  (((Bitmask)1)<<i
143a0 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ) ){.      pIdx-
143b0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
143c0 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
143d0 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
143e0 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
143f0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
14400 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28  Src->colUsed & (
14410 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42  ((Bitmask)1)<<(B
14420 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 66 6f  MS-1)) ){.    fo
14430 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61  r(i=BMS-1; i<pTa
14440 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
14450 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
14460 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
14470 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
14480 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
14490 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
144a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
144b0 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20  ==nColumn );..  
144c0 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75  /* Create the au
144d0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f  tomatic index */
144e0 0a 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73 71  .  pKeyinfo = sq
144f0 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
14500 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
14510 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
14520 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b  l->iIdxCur>=0 );
14530 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14540 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41  dOp4(v, OP_OpenA
14550 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c  utoindex, pLevel
14560 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75  ->iIdxCur, nColu
14570 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  mn+1, 0,.       
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
14590 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34  ar*)pKeyinfo, P4
145a0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
145b0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
145c0 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
145d0 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
145e0 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
145f0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
14600 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
14610 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
14620 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14630 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
14640 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72  l->iTabCur);.  r
14650 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
14660 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14670 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  rse);.  sqlite3G
14680 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
14690 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c  pParse, pIdx, pL
146a0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72  evel->iTabCur, r
146b0 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20  egRecord, 1);.  
146c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
146d0 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
146e0 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t, pLevel->iIdxC
146f0 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ur, regRecord);.
14700 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14710 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
14720 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
14730 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14740 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
14750 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
14760 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 73   addrTop+1);.  s
14770 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14780 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d  P5(v, SQLITE_STM
14790 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
147a0 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  X);.  sqlite3Vdb
147b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
147c0 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  rTop);.  sqlite3
147d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
147e0 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
147f0 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20  );.  .  /* Jump 
14800 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69  here when skippi
14810 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
14820 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
14830 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14840 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a 23  , addrInit);.}.#
14850 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14860 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
14870 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  NDEX */..#ifndef
14880 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
14890 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
148a0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70  Allocate and pop
148b0 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33  ulate an sqlite3
148c0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
148d0 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65  cture. It is the
148e0 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
148f0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
14900 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
14910 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75  release the stru
14920 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73  cture.** by pass
14930 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ing the pointer 
14940 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
14950 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c   function to sql
14960 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
14970 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
14980 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63  ndex_info *alloc
14990 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20  ateIndexInfo(.  
149a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
149b0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
149c0 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  C,.  struct SrcL
149d0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
149e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
149f0 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  erBy.){.  int i,
14a00 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
14a10 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
14a20 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
14a30 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
14a40 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14a50 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
14a60 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
14a70 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
14a80 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
14a90 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
14aa0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
14ab0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
14ac0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
14ad0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
14ae0 0a 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28  .  /*WHERETRACE(
14af0 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e  ("Recomputing in
14b00 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e  dex info for %s.
14b10 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61  ..\n", pSrc->pTa
14b20 62 2d 3e 7a 4e 61 6d 65 29 29 3b 2a 2f 0a 0a 20  b->zName));*/.. 
14b30 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
14b40 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
14b50 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
14b60 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
14b70 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ing.  ** to this
14b80 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
14b90 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d  /.  for(i=nTerm=
14ba0 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
14bb0 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
14bc0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
14bd0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
14be0 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
14bf0 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
14c00 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
14c10 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
14c20 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
14c30 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
14c40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
14c50 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14c60 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
14c70 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
14c80 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
14c90 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ULL );.    if( p
14ca0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
14cb0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  & (WO_ISNULL) ) 
14cc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
14cd0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
14ce0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
14cf0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
14d00 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
14d10 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
14d20 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
14d30 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
14d40 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
14d50 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
14d60 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
14d70 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
14d80 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
14d90 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
14da0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14db0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
14dc0 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
14dd0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
14de0 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
14df0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
14e00 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
14e10 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
14e20 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
14e30 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
14e40 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
14e50 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
14e60 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
14e70 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
14e80 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
14e90 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
14ea0 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
14eb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
14ec0 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
14ed0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
14ee0 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
14ef0 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
14f00 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
14f10 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
14f20 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
14f50 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
14f60 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
14f70 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
14f90 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
14fa0 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
14fb0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
14fc0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14fd0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14fe0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
14ff0 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62  ");.    /* (doub
15000 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
15010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
15020 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
15030 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
15040 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
15050 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
15060 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
15070 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
15080 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
15090 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
150a0 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
150b0 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
150c0 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
150d0 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
150e0 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
150f0 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
15100 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
15110 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
15120 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
15130 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
15140 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
15150 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
15160 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
15170 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
15180 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
15190 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
151a0 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
151b0 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
151c0 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
151d0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
151e0 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
151f0 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
15200 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
15210 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
15220 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
15230 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
15240 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
15250 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
15260 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
15270 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
15280 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
15290 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
152a0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
152b0 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
152c0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
152d0 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
152e0 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
152f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
15300 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
15310 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
15320 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
15380 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
15390 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
153a0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
153b0 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
153c0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
153d0 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
153e0 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
153f0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
15400 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
15410 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
15420 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
15430 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
15440 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
15450 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
15460 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
15470 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
15480 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
15490 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
154a0 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
154b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
154c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
154d0 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
154e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
154f0 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
15500 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
15510 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
15520 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
15530 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
15540 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
15550 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
15560 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
15570 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
15580 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
15590 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
155a0 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
155b0 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
155c0 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
155d0 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
155e0 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
155f0 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
15600 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
15610 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
15620 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
15630 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
15640 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
15650 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
15660 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
15670 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
15680 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
15690 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
156a0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
156b0 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
156c0 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
156d0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
156e0 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
156f0 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
15700 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
15710 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
15720 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
15730 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
15740 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
15750 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
15760 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
15770 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
15780 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15790 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
157a0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
157b0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
157c0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
157d0 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
157e0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
157f0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
15800 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
15810 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
15820 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
15830 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
15840 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
15850 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
15860 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
15870 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
15880 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
15890 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
158a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
158b0 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
158c0 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
158d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
158e0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
158f0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
15900 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
15910 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
15920 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
15930 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
15940 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
15950 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
15960 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
15970 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20  ex_info pointer 
15980 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
15990 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
159a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
159b0 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
159c0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
159d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
159e0 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
159f0 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
15a00 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
15a10 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
15a20 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
15a30 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
15a40 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
15a50 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
15a60 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
15a70 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
15a80 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
15a90 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
15aa0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
15ab0 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
15ac0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
15ad0 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
15ae0 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
15af0 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
15b00 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
15b10 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
15b20 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
15b30 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
15b40 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
15b50 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
15b60 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
15b70 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
15b80 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
15b90 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
15ba0 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
15bb0 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
15bc0 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28 22   /*WHERETRACE(("
15bd0 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25  xBestIndex for %
15be0 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  s\n", pTab->zNam
15bf0 65 29 29 3b 2a 2f 0a 20 20 54 52 41 43 45 5f 49  e));*/.  TRACE_I
15c00 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
15c10 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
15c20 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
15c30 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
15c40 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
15c50 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
15c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
15c70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
15c80 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
15c90 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15ca0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
15cb0 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
15cc0 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
15cd0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15ce0 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
15cf0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
15d00 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
15d10 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15d20 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
15d30 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
15d40 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
15d50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
15d60 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
15d70 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
15d80 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
15d90 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
15da0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
15db0 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
15dc0 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
15dd0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
15de0 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
15df0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15e00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15e10 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
15e20 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
15e30 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
15e40 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
15e50 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
15e60 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
15e70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a  Parse->nErr;.}..
15e80 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
15e90 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f  he best index fo
15ea0 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  r a virtual tabl
15eb0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73  e..**.** The bes
15ec0 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75  t index is compu
15ed0 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ted by the xBest
15ee0 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20  Index method of 
15ef0 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  the virtual.** t
15f00 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68  able module.  Th
15f10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  is routine is re
15f20 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70  ally just a wrap
15f30 70 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70  per that sets up
15f40 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f  .** the sqlite3_
15f50 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
15f60 74 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65  ture that is use
15f70 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65  d to communicate
15f80 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e   with.** xBestIn
15f90 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20  dex..**.** In a 
15fa0 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69  join, this routi
15fb0 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c  ne might be call
15fc0 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
15fd0 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d  s for the.** sam
15fe0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
15ff0 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
16000 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
16010 72 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  re is created.**
16020 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
16030 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e   on the first in
16040 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75  vocation and reu
16050 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65  sed on all subse
16060 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74  quent.** invocat
16070 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74  ions.  The sqlit
16080 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
16090 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20  ructure is also 
160a0 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64  used when.** cod
160b0 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
160c0 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72  o access the vir
160d0 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65  tual table.  The
160e0 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65   whereInfoDelete
160f0 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  () .** routine t
16100 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65  akes care of fre
16110 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  eing the sqlite3
16120 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
16130 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65  cture after.** e
16140 76 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e  verybody has fin
16150 69 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a  ished with it..*
16160 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
16170 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 57  stVirtualIndex(W
16180 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b  hereBestIdx *p){
16190 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
161a0 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20   = p->pParse;   
161b0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
161c0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
161d0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
161e0 3d 20 70 2d 3e 70 57 43 3b 20 20 20 20 20 20 2f  = p->pWC;      /
161f0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
16200 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
16210 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
16220 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a 20  c = p->pSrc; /* 
16230 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
16240 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
16250 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
16260 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
16270 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
16280 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20  fo *pIdxInfo;.  
16290 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
162a0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
162b0 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
162c0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
162d0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
162e0 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
162f0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
16300 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
16310 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  t nOrderBy;.  in
16320 74 20 62 41 6c 6c 6f 77 49 4e 3b 20 20 20 20 20  t bAllowIN;     
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16340 20 41 6c 6c 6f 77 20 49 4e 20 6f 70 74 69 6d 69   Allow IN optimi
16350 7a 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 64 6f 75  zations */.  dou
16360 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f 2a  ble rCost;..  /*
16370 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c 61   Make sure wsFla
16380 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  gs is initialize
16390 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20 76  d to some sane v
163a0 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  alue. Otherwise,
163b0 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61   if the .  ** ma
163c0 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74 65  lloc in allocate
163d0 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69 6c  IndexInfo() fail
163e0 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
163f0 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61 76  ion returns leav
16400 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67 73  ing.  ** wsFlags
16410 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   in an uninitial
16420 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65 20  ized state, the 
16430 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61 76  caller may behav
16440 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79 2e  e unpredictably.
16450 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
16460 70 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69 7a 65  p->cost, 0, size
16470 6f 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a 20 20  of(p->cost));.  
16480 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  p->cost.plan.wsF
16490 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52  lags = WHERE_VIR
164a0 54 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a  TUALTABLE;..  /*
164b0 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   If the sqlite3_
164c0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
164d0 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  ture has not bee
164e0 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a  n previously.  *
164f0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
16500 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65  initialized, the
16510 6e 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  n allocate and i
16520 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77  nitialize it now
16530 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  ..  */.  pIdxInf
16540 6f 20 3d 20 2a 70 2d 3e 70 70 49 64 78 49 6e 66  o = *p->ppIdxInf
16550 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  o;.  if( pIdxInf
16560 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 2d 3e  o==0 ){.    *p->
16570 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78  ppIdxInfo = pIdx
16580 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49  Info = allocateI
16590 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
165a0 70 57 43 2c 70 53 72 63 2c 70 2d 3e 70 4f 72 64  pWC,pSrc,p->pOrd
165b0 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  erBy);.  }.  if(
165c0 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
165d0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
165e0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
165f0 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  int, the sqlite3
16600 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
16610 63 74 75 72 65 20 74 68 61 74 20 70 49 64 78 49  cture that pIdxI
16620 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20  nfo points.  ** 
16630 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  to will have bee
16640 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65  n initialized, e
16650 69 74 68 65 72 20 64 75 72 69 6e 67 20 74 68 65  ither during the
16660 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74   current invocat
16670 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69  ion or.  ** duri
16680 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e  ng some prior in
16690 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77  vocation.  Now w
166a0 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63  e just have to c
166b0 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a  ustomize the.  *
166c0 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64  * details of pId
166d0 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75  xInfo for the cu
166e0 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  rrent invocation
166f0 20 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a   and pass it to.
16700 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e    ** xBestIndex.
16710 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  .  */..  /* The 
16720 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74  module name must
16730 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73   be defined. Als
16740 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74  o, by this point
16750 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a   there must.  **
16760 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
16770 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
16780 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65   structure. Othe
16790 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74  rwise.  ** sqlit
167a0 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
167b0 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76  ames() would hav
167c0 65 20 70 69 63 6b 65 64 20 75 70 20 74 68 65 20  e picked up the 
167d0 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61  error. .  */.  a
167e0 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d  ssert( pTab->azM
167f0 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54 61 62  oduleArg && pTab
16800 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d  ->azModuleArg[0]
16810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
16820 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
16830 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
16840 20 29 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 6f 6e   );..  /* Try on
16850 63 65 20 6f 72 20 74 77 69 63 65 2e 20 20 4f 6e  ce or twice.  On
16860 20 74 68 65 20 66 69 72 73 74 20 61 74 74 65 6d   the first attem
16870 70 74 2c 20 61 6c 6c 6f 77 20 49 4e 20 6f 70 74  pt, allow IN opt
16880 69 6d 69 7a 61 74 69 6f 6e 73 2e 0a 20 20 2a 2a  imizations..  **
16890 20 49 66 20 61 6e 20 49 4e 20 6f 70 74 69 6d 69   If an IN optimi
168a0 7a 61 74 69 6f 6e 20 69 73 20 61 63 63 65 70 74  zation is accept
168b0 65 64 20 62 79 20 74 68 65 20 76 69 72 74 75 61  ed by the virtua
168c0 6c 20 74 61 62 6c 65 20 78 42 65 73 74 49 6e 64  l table xBestInd
168d0 65 78 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 2c 20  ex.  ** method, 
168e0 62 75 74 20 74 68 65 20 20 70 49 6e 66 6f 2d 3e  but the  pInfo->
168f0 61 43 6f 6e 73 74 72 61 69 6e 55 73 61 67 65 2e  aConstrainUsage.
16900 6f 6d 69 74 20 66 6c 61 67 20 69 73 20 6e 6f 74  omit flag is not
16910 20 73 65 74 2c 20 74 68 65 6e 0a 20 20 2a 2a 20   set, then.  ** 
16920 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20 6e  the query will n
16930 6f 74 20 77 6f 72 6b 20 62 65 63 61 75 73 65 20  ot work because 
16940 69 74 20 6d 69 67 68 74 20 61 6c 6c 6f 77 20 64  it might allow d
16950 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 69 6e  uplicate rows in
16960 0a 20 20 2a 2a 20 6f 75 74 70 75 74 2e 20 20 49  .  ** output.  I
16970 6e 20 74 68 61 74 20 63 61 73 65 2c 20 72 75 6e  n that case, run
16980 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
16990 6d 65 74 68 6f 64 20 61 20 73 65 63 6f 6e 64 20  method a second 
169a0 74 69 6d 65 0a 20 20 2a 2a 20 77 69 74 68 6f 75  time.  ** withou
169b0 74 20 74 68 65 20 49 4e 20 63 6f 6e 73 74 72 61  t the IN constra
169c0 69 6e 74 73 2e 20 20 55 73 75 61 6c 6c 79 20 74  ints.  Usually t
169d0 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
169e0 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 20 54 68  ns once..  ** Th
169f0 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74  e loop will exit
16a00 20 75 73 69 6e 67 20 61 20 22 62 72 65 61 6b 22   using a "break"
16a10 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
16a20 0a 20 20 66 6f 72 28 62 41 6c 6c 6f 77 49 4e 3d  .  for(bAllowIN=
16a30 31 3b 20 31 3b 20 62 41 6c 6c 6f 77 49 4e 2d 2d  1; 1; bAllowIN--
16a40 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  ){.    assert( b
16a50 41 6c 6c 6f 77 49 4e 3d 3d 30 20 7c 7c 20 62 41  AllowIN==0 || bA
16a60 6c 6c 6f 77 49 4e 3d 3d 31 20 29 3b 0a 0a 20 20  llowIN==1 );..  
16a70 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f    /* Set the aCo
16a80 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
16a90 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69  e fields and ini
16aa0 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 20  tialize all .   
16ab0 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61   ** output varia
16ac0 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20  bles to zero..  
16ad0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 61 43 6f 6e    **.    ** aCon
16ae0 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65  straint[].usable
16af0 20 69 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e   is true for con
16b00 73 74 72 61 69 6e 74 73 20 77 68 65 72 65 20 74  straints where t
16b10 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20  he right-hand.  
16b20 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61 69    ** side contai
16b30 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63  ns only referenc
16b40 65 73 20 74 6f 20 74 61 62 6c 65 73 20 74 6f 20  es to tables to 
16b50 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
16b60 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74  current.    ** t
16b70 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  able.  In other 
16b80 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 63 6f  words, if the co
16b90 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74  nstraint is of t
16ba0 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 2a 2a 0a  he form:.    **.
16bb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
16bc0 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20   column = expr. 
16bd0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 61 6e 64     **.    ** and
16be0 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
16bf0 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  ng a join, then 
16c00 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  the constraint o
16c10 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 20  n column is .   
16c20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69   ** only valid i
16c30 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66  f all tables ref
16c40 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20  erenced in expr 
16c50 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66  occur to the lef
16c60 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
16c70 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
16c80 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2a 0a   column..    **.
16c90 20 20 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73      ** The aCons
16ca0 74 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 20  traints[] array 
16cb0 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
16cc0 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61   for all constra
16cd0 69 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ints.    ** on t
16ce0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
16cf0 2e 20 20 54 68 61 74 20 77 61 79 20 77 65 20 6f  .  That way we o
16d00 6e 6c 79 20 68 61 76 65 20 74 6f 20 63 6f 6d 70  nly have to comp
16d10 75 74 65 20 69 74 20 6f 6e 63 65 0a 20 20 20 20  ute it once.    
16d20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 77  ** even though w
16d30 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20 70  e might try to p
16d40 69 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e 64  ick the best ind
16d50 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ex multiple time
16d60 73 2e 0a 20 20 20 20 2a 2a 20 46 6f 72 20 65 61  s..    ** For ea
16d70 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69  ch attempt at pi
16d80 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  cking an index, 
16d90 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62  the order of tab
16da0 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  les in the.    *
16db0 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20  * join might be 
16dc0 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20  different so we 
16dd0 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74  have to recomput
16de0 65 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61  e the usable fla
16df0 67 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 74 69  g.    ** each ti
16e00 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  me..    */.    p
16e10 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
16e20 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
16e30 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
16e40 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
16e50 61 69 6e 74 3b 0a 20 20 20 20 70 55 73 61 67 65  aint;.    pUsage
16e60 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
16e70 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
16e80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
16e90 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
16ea0 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
16eb0 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d  ns++){.      j =
16ec0 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
16ed0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54  Offset;.      pT
16ee0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
16ef0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
16f00 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 26  rm->prereqRight&
16f10 70 2d 3e 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a  p->notReady)==0.
16f20 20 20 20 20 20 20 20 26 26 20 28 62 41 6c 6c 6f         && (bAllo
16f30 77 49 4e 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 65  wIN || (pTerm->e
16f40 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
16f50 29 3d 3d 30 29 0a 20 20 20 20 20 20 29 7b 0a 20  )==0).      ){. 
16f60 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
16f70 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
16f80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16f90 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
16fa0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  le = 0;.      }.
16fb0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
16fc0 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65  (pUsage, 0, size
16fd0 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49  of(pUsage[0])*pI
16fe0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
16ff0 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49  int);.    if( pI
17000 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
17010 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20  eeIdxStr ){.    
17020 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17030 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
17040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78  ;.    }.    pIdx
17050 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
17060 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
17070 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
17080 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
17090 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
170a0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
170b0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
170c0 30 3b 0a 20 20 20 20 2f 2a 20 28 28 64 6f 75 62  0;.    /* ((doub
170d0 6c 65 29 32 29 20 49 6e 20 63 61 73 65 20 6f 66  le)2) In case of
170e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
170f0 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
17100 2f 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  /.    pIdxInfo->
17110 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
17120 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
17130 20 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20   ((double)2);.  
17140 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64    nOrderBy = pId
17150 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b  xInfo->nOrderBy;
17160 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 4f 72  .    if( !p->pOr
17170 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 70  derBy ){.      p
17180 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
17190 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  y = 0;.    }.  .
171a0 20 20 20 20 69 66 28 20 76 74 61 62 42 65 73 74      if( vtabBest
171b0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54  Index(pParse, pT
171c0 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 20 29 7b  ab, pIdxInfo) ){
171d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
171e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 70 49 64 78     }.  .    pIdx
171f0 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
17200 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
17210 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
17220 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
17230 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
17240 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
17250 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
17260 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
17270 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 61   if( pUsage[i].a
17280 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
17290 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
172a0 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
172b0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
172c0 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
172d0 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 75 73 65       p->cost.use
172e0 64 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  d |= pTerm->prer
172f0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
17300 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
17310 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
17320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17330 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d  if( pUsage[i].om
17340 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
17350 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
17360 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e  ttempt to use an
17370 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69   IN constraint i
17380 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
17390 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
173a0 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ** says that the
173b0 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63   equivalent EQ c
173c0 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
173d0 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74   be safely omitt
173e0 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
173f0 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65  ** If we do atte
17400 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20  mpt to use such 
17410 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f  a constraint, so
17420 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65  me rows might be
17430 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
17440 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20  repeated in the 
17450 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20  output. */.     
17460 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17480 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c      /* A virtual
17490 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63   table that is c
174a0 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e  onstrained by an
174b0 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e   IN clause may n
174c0 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ot.          ** 
174d0 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45  consume the ORDE
174e0 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61  R BY clause beca
174f0 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65  use (1) the orde
17500 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20  r of IN terms.  
17510 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
17520 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
17530 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
17540 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
17550 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ms and.         
17560 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65   ** (2) Multiple
17570 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20   outputs from a 
17580 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20  single IN value 
17590 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20  will not merge. 
175a0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65           ** toge
175b0 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
175c0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
175d0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
175e0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
175f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17600 66 28 20 69 3e 3d 70 49 64 78 49 6e 66 6f 2d 3e  f( i>=pIdxInfo->
17610 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72  nConstraint ) br
17620 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  eak;.  }..  /* T
17630 68 65 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  he orderByConsum
17640 65 64 20 73 69 67 6e 61 6c 20 69 73 20 6f 6e 6c  ed signal is onl
17650 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 6f  y valid if all o
17660 75 74 65 72 20 6c 6f 6f 70 73 20 63 6f 6c 6c 65  uter loops colle
17670 63 74 69 76 65 6c 79 0a 20 20 2a 2a 20 67 65 6e  ctively.  ** gen
17680 65 72 61 74 65 20 6a 75 73 74 20 61 20 73 69 6e  erate just a sin
17690 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
176a0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 49  t..  */.  if( pI
176b0 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
176c0 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 66  onsumed ){.    f
176d0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 69 3b 20  or(i=0; i<p->i; 
176e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
176f0 28 70 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 70 6c  (p->aLevel[i].pl
17700 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
17710 52 45 5f 55 4e 49 51 55 45 29 3d 3d 30 20 29 7b  RE_UNIQUE)==0 ){
17720 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
17730 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
17740 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ed = 0;.      }.
17750 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
17760 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
17770 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17780 2c 20 61 6e 64 20 74 68 65 20 73 65 6c 65 63 74  , and the select
17790 65 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ed virtual table
177a0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 64 6f 65 73   index.  ** does
177b0 20 6e 6f 74 20 73 61 74 69 73 66 79 20 69 74 2c   not satisfy it,
177c0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 63 6f   increase the co
177d0 73 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 61  st of the scan a
177e0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 69 73  ccordingly. This
177f0 0a 20 20 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  .  ** matches th
17800 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  e processing for
17810 20 6e 6f 6e 2d 76 69 72 74 75 61 6c 20 74 61 62   non-virtual tab
17820 6c 65 73 20 69 6e 20 62 65 73 74 42 74 72 65 65  les in bestBtree
17830 49 6e 64 65 78 28 29 2e 0a 20 20 2a 2f 0a 20 20  Index()..  */.  
17840 72 43 6f 73 74 20 3d 20 70 49 64 78 49 6e 66 6f  rCost = pIdxInfo
17850 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b  ->estimatedCost;
17860 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
17870 42 79 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e  By && pIdxInfo->
17880 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d  orderByConsumed=
17890 3d 30 20 29 7b 0a 20 20 20 20 72 43 6f 73 74 20  =0 ){.    rCost 
178a0 2b 3d 20 65 73 74 4c 6f 67 28 72 43 6f 73 74 29  += estLog(rCost)
178b0 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a 0a 20 20 2f  *rCost;.  }..  /
178c0 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20 6e 6f  * The cost is no
178d0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  t allowed to be 
178e0 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49  larger than SQLI
178f0 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68 65 0a  TE_BIG_DBL (the.
17900 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75    ** inital valu
17910 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74 20  e of lowestCost 
17920 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66  in this loop. If
17930 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65   it is, then the
17940 0a 20 20 2a 2a 20 28 63 6f 73 74 3c 6c 6f 77 65  .  ** (cost<lowe
17950 73 74 43 6f 73 74 29 20 74 65 73 74 20 62 65 6c  stCost) test bel
17960 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ow will never be
17970 20 74 72 75 65 2e 0a 20 20 2a 2a 20 0a 20 20 2a   true..  ** .  *
17980 2a 20 55 73 65 20 22 28 64 6f 75 62 6c 65 29 32  * Use "(double)2
17990 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 32 2e  " instead of "2.
179a0 30 22 20 69 6e 20 63 61 73 65 20 4f 4d 49 54 5f  0" in case OMIT_
179b0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20 0a  FLOATING_POINT .
179c0 20 20 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e    ** is defined.
179d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 53 51 4c  .  */.  if( (SQL
179e0 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f  ITE_BIG_DBL/((do
179f0 75 62 6c 65 29 32 29 29 3c 72 43 6f 73 74 20 29  uble)2))<rCost )
17a00 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43  {.    p->cost.rC
17a10 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49  ost = (SQLITE_BI
17a20 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32  G_DBL/((double)2
17a30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
17a40 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d   p->cost.rCost =
17a50 20 72 43 6f 73 74 3b 0a 20 20 7d 0a 20 20 70 2d   rCost;.  }.  p-
17a60 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 56 74  >cost.plan.u.pVt
17a70 61 62 49 64 78 20 3d 20 70 49 64 78 49 6e 66 6f  abIdx = pIdxInfo
17a80 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
17a90 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
17aa0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74  d ){.    p->cost
17ab0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
17ac0 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a   WHERE_ORDERED;.
17ad0 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e      p->cost.plan
17ae0 2e 6e 4f 42 53 61 74 20 3d 20 6e 4f 72 64 65 72  .nOBSat = nOrder
17af0 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
17b00 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f   p->cost.plan.nO
17b10 42 53 61 74 20 3d 20 70 2d 3e 69 20 3f 20 70 2d  BSat = p->i ? p-
17b20 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e  >aLevel[p->i-1].
17b30 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3a 20 30 3b  plan.nOBSat : 0;
17b40 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 73 74 2e 70  .  }.  p->cost.p
17b50 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70  lan.nEq = 0;.  p
17b60 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
17b70 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20  y = nOrderBy;.. 
17b80 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
17b90 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  a more efficient
17ba0 20 61 63 63 65 73 73 20 70 61 74 74 65 72 6e 20   access pattern 
17bb0 62 79 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  by using multipl
17bc0 65 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74  e indexes.  ** t
17bd0 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52  o optimize an OR
17be0 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
17bf0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
17c00 75 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73  use. .  */.  bes
17c10 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70  tOrClauseIndex(p
17c20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
17c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
17c40 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64  ALTABLE */..#ifd
17c50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17c60 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT3./*.** Est
17c70 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69  imate the locati
17c80 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c  on of a particul
17c90 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c  ar key among all
17ca0 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69   keys in an.** i
17cb0 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65  ndex.  Store the
17cc0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61   results in aSta
17cd0 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  t as follows:.**
17ce0 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  .**    aStat[0] 
17cf0 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
17d00 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68   of rows less th
17d10 61 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53  an pVal.**    aS
17d20 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e  tat[1]      Est.
17d30 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
17d40 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a  equal to pVal.**
17d50 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
17d60 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
17d70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
17d80 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20  hereKeyStats(.  
17d90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
17da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
17db0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17dc0 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
17dd0 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
17de0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
17df0 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20  consider domain 
17e00 6f 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  of */.  sqlite3_
17e10 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20 20  value *pVal,    
17e20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
17e30 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e  consider */.  in
17e40 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20  t roundUp,      
17e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75            /* Rou
17e60 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20  nd up if true.  
17e70 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61  Round down if fa
17e80 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  lse */.  tRowcnt
17e90 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20   *aStat         
17ea0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61       /* OUT: sta
17eb0 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ts written here 
17ec0 2a 2f 0a 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20  */.){.  tRowcnt 
17ed0 6e 3b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  n;.  IndexSample
17ee0 20 2a 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74   *aSample;.  int
17ef0 20 69 2c 20 65 54 79 70 65 3b 0a 20 20 69 6e 74   i, eType;.  int
17f00 20 69 73 45 71 20 3d 20 30 3b 0a 20 20 69 36 34   isEq = 0;.  i64
17f10 20 76 3b 0a 20 20 64 6f 75 62 6c 65 20 72 2c 20   v;.  double r, 
17f20 72 53 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 72  rS;..  assert( r
17f30 6f 75 6e 64 55 70 3d 3d 30 20 7c 7c 20 72 6f 75  oundUp==0 || rou
17f40 6e 64 55 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73  ndUp==1 );.  ass
17f50 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ert( pIdx->nSamp
17f60 6c 65 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 56  le>0 );.  if( pV
17f70 61 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  al==0 ) return S
17f80 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 6e  QLITE_ERROR;.  n
17f90 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   = pIdx->aiRowEs
17fa0 74 5b 30 5d 3b 0a 20 20 61 53 61 6d 70 6c 65 20  t[0];.  aSample 
17fb0 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
17fc0 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
17fd0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
17fe0 61 6c 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  al);..  if( eTyp
17ff0 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  e==SQLITE_INTEGE
18000 52 20 29 7b 0a 20 20 20 20 76 20 3d 20 73 71 6c  R ){.    v = sql
18010 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
18020 28 70 56 61 6c 29 3b 0a 20 20 20 20 72 20 3d 20  (pVal);.    r = 
18030 28 69 36 34 29 76 3b 0a 20 20 20 20 66 6f 72 28  (i64)v;.    for(
18040 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61  i=0; i<pIdx->nSa
18050 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
18060 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
18070 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
18080 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
18090 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
180a0 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49  e[i].eType>=SQLI
180b0 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b  TE_TEXT ) break;
180c0 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
180d0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
180e0 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
180f0 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
18100 6c 65 5b 69 5d 2e 75 2e 69 3e 3d 76 20 29 7b 0a  le[i].u.i>=v ){.
18110 20 20 20 20 20 20 20 20 20 20 69 73 45 71 20 3d            isEq =
18120 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3d   aSample[i].u.i=
18130 3d 76 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  =v;.          br
18140 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
18150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18160 20 20 20 20 61 73 73 65 72 74 28 20 61 53 61 6d      assert( aSam
18170 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
18180 4c 49 54 45 5f 46 4c 4f 41 54 20 29 3b 0a 20 20  LITE_FLOAT );.  
18190 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
181a0 65 5b 69 5d 2e 75 2e 72 3e 3d 72 20 29 7b 0a 20  e[i].u.r>=r ){. 
181b0 20 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20           isEq = 
181c0 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3d 3d  aSample[i].u.r==
181d0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  r;.          bre
181e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
181f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
18200 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53  lse if( eType==S
18210 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
18220 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76     r = sqlite3_v
18230 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c  alue_double(pVal
18240 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
18250 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b  i<pIdx->nSample;
18260 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
18270 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
18280 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e==SQLITE_NULL )
18290 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
182a0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
182b0 65 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45  eType>=SQLITE_TE
182c0 58 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  XT ) break;.    
182d0 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
182e0 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46  .eType==SQLITE_F
182f0 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
18300 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  rS = aSample[i].
18310 75 2e 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  u.r;.      }else
18320 7b 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61  {.        rS = a
18330 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3b 0a 20  Sample[i].u.i;. 
18340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18350 20 72 53 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20   rS>=r ){.      
18360 20 20 69 73 45 71 20 3d 20 72 53 3d 3d 72 3b 0a    isEq = rS==r;.
18370 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18380 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18390 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d  else if( eType==
183a0 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
183b0 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 66     i = 0;.    if
183c0 28 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 65 54 79  ( aSample[0].eTy
183d0 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  pe==SQLITE_NULL 
183e0 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 7d 65  ) isEq = 1;.  }e
183f0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
18400 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54   eType==SQLITE_T
18410 45 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  EXT || eType==SQ
18420 4c 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  LITE_BLOB );.   
18430 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
18440 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
18450 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
18460 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
18470 49 54 45 5f 54 45 58 54 20 7c 7c 20 61 53 61 6d  ITE_TEXT || aSam
18480 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
18490 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
184a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
184b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
184c0 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
184d0 65 20 29 7b 20 20 20 20 20 20 0a 20 20 20 20 20  e ){      .     
184e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
184f0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
18500 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
18510 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
18520 2a 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  *z;.      if( eT
18530 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
18540 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20   ){.        z = 
18550 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69  (const u8 *)sqli
18560 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
18570 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43  Val);.        pC
18580 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
18590 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  oll;.        ass
185a0 65 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d  ert( pColl->enc=
185b0 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a  =SQLITE_UTF8 );.
185c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
185d0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
185e0 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70  ite3GetCollSeq(p
185f0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 55 54  Parse, SQLITE_UT
18600 46 38 2c 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a  F8, 0, *pIdx->az
18610 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
18620 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20  f( pColl==0 ){. 
18630 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
18640 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
18650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18660 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29  z = (const u8 *)
18670 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
18680 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  (pVal, pColl->en
18690 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
186a0 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  !z ){.          
186b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
186c0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
186d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
186e0 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f   && pColl && pCo
186f0 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20  ll->xCmp );.    
18700 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71    }.      n = sq
18710 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28  lite3ValueBytes(
18720 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  pVal, pColl->enc
18730 29 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 28  );.  .      for(
18740 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ; i<pIdx->nSampl
18750 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
18760 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
18770 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20  int eSampletype 
18780 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  = aSample[i].eTy
18790 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pe;.        if( 
187a0 65 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70  eSampletype<eTyp
187b0 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
187c0 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c        if( eSampl
187d0 65 74 79 70 65 21 3d 65 54 79 70 65 20 29 20 62  etype!=eType ) b
187e0 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51  reak;.#ifndef SQ
187f0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
18800 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
18810 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55  l->enc!=SQLITE_U
18820 54 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TF8 ){.         
18830 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20   int nSample;.  
18840 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
18850 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55  ample = sqlite3U
18860 74 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20  tf8to16(.       
18870 20 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c         db, pColl
18880 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69  ->enc, aSample[i
18890 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69  ].u.z, aSample[i
188a0 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c  ].nByte, &nSampl
188b0 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
188c0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53           if( !zS
188d0 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ample ){.       
188e0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
188f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
18900 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
18910 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
18920 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18930 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c          c = pCol
18940 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
18950 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a  User, nSample, z
18960 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20  Sample, n, z);. 
18970 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18980 44 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70  DbFree(db, zSamp
18990 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  le);.        }el
189a0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
189b0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20    {.          c 
189c0 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
189d0 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d  oll->pUser, aSam
189e0 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53  ple[i].nByte, aS
189f0 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c  ample[i].u.z, n,
18a00 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   z);.        }. 
18a10 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30 20         if( c>=0 
18a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
18a30 20 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20 31   c==0 ) isEq = 1
18a40 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
18a50 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
18a60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
18a70 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
18a80 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69  nt, aSample[i] i
18a90 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
18aa0 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74  le that is great
18ab0 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20  er than.  ** or 
18ac0 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20  equal to pVal.  
18ad0 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e  Or if i==pIdx->n
18ae0 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c  Sample, then all
18af0 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73   samples are les
18b00 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c  s.  ** than pVal
18b10 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d  .  If aSample[i]
18b20 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73 45  ==pVal, then isE
18b30 71 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  q==1..  */.  if(
18b40 20 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73 73   isEq ){.    ass
18b50 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61  ert( i<pIdx->nSa
18b60 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74 61  mple );.    aSta
18b70 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
18b80 5d 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61 74  ].nLt;.    aStat
18b90 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [1] = aSample[i]
18ba0 2e 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  .nEq;.  }else{. 
18bb0 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
18bc0 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  r, iUpper, iGap;
18bd0 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
18be0 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
18bf0 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  0;.      iUpper 
18c00 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74  = aSample[0].nLt
18c10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18c20 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70     iUpper = i>=p
18c30 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e  Idx->nSample ? n
18c40 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c   : aSample[i].nL
18c50 74 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  t;.      iLower 
18c60 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  = aSample[i-1].n
18c70 45 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31  Eq + aSample[i-1
18c80 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ].nLt;.    }.   
18c90 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78   aStat[1] = pIdx
18ca0 2d 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66 28  ->avgEq;.    if(
18cb0 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20   iLower>=iUpper 
18cc0 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
18cd0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
18ce0 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65      iGap = iUppe
18cf0 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20  r - iLower;.    
18d00 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55  }.    if( roundU
18d10 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  p ){.      iGap 
18d20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20  = (iGap*2)/3;.  
18d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
18d40 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20  Gap = iGap/3;.  
18d50 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d    }.    aStat[0]
18d60 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70   = iLower + iGap
18d70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
18d80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
18d90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
18da0 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a  BLE_STAT3 */../*
18db0 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f  .** If expressio
18dc0 6e 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e  n pExpr represen
18dd0 74 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  ts a literal val
18de0 75 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ue, set *pp to p
18df0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71  oint to.** an sq
18e00 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
18e10 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
18e20 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c   the same value,
18e30 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a   with affinity.*
18e40 2a 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  * aff applied to
18e50 20 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75   it, before retu
18e60 72 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65  rning. It is the
18e70 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
18e80 6f 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  of the .** calle
18e90 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
18ea0 72 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72  release this str
18eb0 75 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e  ucture by passin
18ec0 67 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  g it to .** sqli
18ed0 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
18ee0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
18ef0 72 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20  rent parse is a 
18f00 72 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74  recompile (sqlit
18f10 65 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61  e3Reprepare()) a
18f20 6e 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61  nd pExpr.** is a
18f30 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74  n SQL variable t
18f40 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61  hat currently ha
18f50 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  s a non-NULL val
18f60 75 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a  ue bound to it,.
18f70 2a 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  ** create an sql
18f80 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
18f90 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
18fa0 74 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69  this value, agai
18fb0 6e 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69  n with.** affini
18fc0 74 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74  ty aff applied t
18fd0 6f 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a  o it, instead..*
18fe0 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
18ff0 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70  of the above app
19000 6c 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  ly, set *pp to N
19010 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
19020 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
19030 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
19040 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
19050 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69  SQLITE_OK..*/.#i
19060 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19070 4c 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63 20  LE_STAT3.static 
19080 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  int valueFromExp
19090 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
190a0 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  se, .  Expr *pEx
190b0 70 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a  pr, .  u8 aff, .
190c0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
190d0 2a 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45  **pp.){.  if( pE
190e0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  xpr->op==TK_VARI
190f0 41 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78 70  ABLE.   || (pExp
19100 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
19110 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 32  ER && pExpr->op2
19120 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20  ==TK_VARIABLE). 
19130 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72   ){.    int iVar
19140 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
19150 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
19160 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61  beSetVarmask(pPa
19170 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72  rse->pVdbe, iVar
19180 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c  );.    *pp = sql
19190 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
191a0 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
191b0 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b  are, iVar, aff);
191c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
191d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
191e0 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65  urn sqlite3Value
191f0 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d  FromExpr(pParse-
19200 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49  >db, pExpr, SQLI
19210 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70  TE_UTF8, aff, pp
19220 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
19230 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19240 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
19250 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
19260 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
19270 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
19280 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
19290 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
192a0 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
192b0 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
192c0 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
192d0 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
192e0 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
192f0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
19300 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
19310 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
19320 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
19330 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
19340 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
19350 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
19360 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
19370 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
19380 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
19390 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
193a0 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
193b0 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193d0 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
193e0 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
19400 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19420 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
19430 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
19440 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
19450 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
19460 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
19470 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
19480 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
19490 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
194a0 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
194b0 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d  ** The nEq param
194c0 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
194d0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
194e0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62  index column sub
194f0 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72  ject to the.** r
19500 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
19510 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
19520 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
19530 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
19540 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a  aints.** optimiz
19550 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
19560 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
19570 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
19580 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a  ming index p is.
19590 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  ** on t1(a, b), 
195a0 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
195b0 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
195c0 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
195d0 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
195e0 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
195f0 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f  .** then nEq sho
19600 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68  uld be passed th
19610 65 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68  e value 1 (as th
19620 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
19630 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c  ed column,.** b,
19640 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c   is the second l
19650 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
19660 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
19670 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
19680 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
19690 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
196a0 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
196b0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
196c0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
196d0 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  d 0..**.** The r
196e0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
196f0 20 61 6e 20 69 6e 74 65 67 65 72 20 64 69 76 69   an integer divi
19700 73 6f 72 20 74 6f 20 72 65 64 75 63 65 20 74 68  sor to reduce th
19710 65 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20 73  e estimated.** s
19720 65 61 72 63 68 20 73 70 61 63 65 2e 20 20 41 20  earch space.  A 
19730 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
19740 31 20 6d 65 61 6e 73 20 74 68 61 74 20 72 61 6e  1 means that ran
19750 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ge constraints a
19760 72 65 0a 2a 2a 20 6e 6f 20 68 65 6c 70 20 61 74  re.** no help at
19770 20 61 6c 6c 2e 20 20 41 20 72 65 74 75 72 6e 20   all.  A return 
19780 76 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73  value of 2 means
19790 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
197a0 74 73 20 61 72 65 0a 2a 2a 20 65 78 70 65 63 74  ts are.** expect
197b0 65 64 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ed to reduce the
197c0 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
197d0 20 68 61 6c 66 2e 20 20 41 6e 64 20 73 6f 20 66   half.  And so f
197e0 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  orth....**.** In
197f0 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
19800 73 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41  sqlite_stat3 ANA
19810 4c 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68 20  LYZE data, each 
19820 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
19830 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20  .** reduces the 
19840 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
19850 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 20  a factor of 4.  
19860 48 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63  Hence a single c
19870 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a  onstraint (x>?).
19880 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  ** results in a 
19890 72 65 74 75 72 6e 20 6f 66 20 34 20 61 6e 64 20  return of 4 and 
198a0 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  a range constrai
198b0 6e 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  nt (x>? AND x<?)
198c0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61   results.** in a
198d0 20 72 65 74 75 72 6e 20 6f 66 20 31 36 2e 0a 2a   return of 16..*
198e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
198f0 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a  reRangeScanEst(.
19900 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
19910 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
19920 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
19930 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
19940 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20   Index *p,      
19950 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
19960 65 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ex containing th
19970 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64  e range-compared
19980 20 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a   column; "x" */.
19990 20 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20    int nEq,      
199a0 20 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20         /* index 
199b0 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f  into p->aCol[] o
199c0 66 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70  f the range-comp
199d0 61 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  ared column */. 
199e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
199f0 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
19a00 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
19a10 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
19a20 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
19a30 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
19a40 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
19a50 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
19a60 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
19a70 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
19a80 0a 20 20 64 6f 75 62 6c 65 20 2a 70 52 61 6e 67  .  double *pRang
19a90 65 44 69 76 20 20 20 2f 2a 20 4f 55 54 3a 20 52  eDiv   /* OUT: R
19aa0 65 64 75 63 65 20 73 65 61 72 63 68 20 73 70 61  educe search spa
19ab0 63 65 20 62 79 20 74 68 69 73 20 64 69 76 69 73  ce by this divis
19ac0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  or */.){.  int r
19ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
19ae0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19af0 41 42 4c 45 5f 53 54 41 54 33 0a 0a 20 20 69 66  ABLE_STAT3..  if
19b00 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e  ( nEq==0 && p->n
19b10 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71  Sample ){.    sq
19b20 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 61  lite3_value *pRa
19b30 6e 67 65 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77  ngeVal;.    tRow
19b40 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a  cnt iLower = 0;.
19b50 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
19b60 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  er = p->aiRowEst
19b70 5b 30 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74  [0];.    tRowcnt
19b80 20 61 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61 66   a[2];.    u8 af
19b90 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61  f = p->pTable->a
19ba0 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Col[p->aiColumn[
19bb0 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20  0]].affinity;.. 
19bc0 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
19bd0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
19be0 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78  pr = pLower->pEx
19bf0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
19c00 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
19c10 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
19c20 70 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65  pr, aff, &pRange
19c30 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Val);.      asse
19c40 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70  rt( (pLower->eOp
19c50 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
19c60 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
19c70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19c80 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20  TE_OK.       && 
19c90 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
19ca0 61 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56  arse, p, pRangeV
19cb0 61 6c 2c 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54  al, 0, a)==SQLIT
19cc0 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20  E_OK.      ){.  
19cd0 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
19ce0 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
19cf0 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61   (pLower->eOpera
19d00 74 6f 72 20 26 20 57 4f 5f 47 54 29 21 3d 30 20  tor & WO_GT)!=0 
19d10 29 20 69 4c 6f 77 65 72 20 2b 3d 20 61 5b 31 5d  ) iLower += a[1]
19d20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19d30 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19d40 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20  (pRangeVal);.   
19d50 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
19d60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 55 70 70  QLITE_OK && pUpp
19d70 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  er ){.      Expr
19d80 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72   *pExpr = pUpper
19d90 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
19da0 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75  .      rc = valu
19db0 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
19dc0 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70  , pExpr, aff, &p
19dd0 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20  RangeVal);.     
19de0 20 61 73 73 65 72 74 28 20 28 70 55 70 70 65 72   assert( (pUpper
19df0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
19e00 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
19e10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
19e20 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
19e30 20 20 26 26 20 77 68 65 72 65 4b 65 79 53 74 61    && whereKeySta
19e40 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
19e50 61 6e 67 65 56 61 6c 2c 20 31 2c 20 61 29 3d 3d  angeVal, 1, a)==
19e60 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
19e70 29 7b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  ){.        iUppe
19e80 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
19e90 20 20 69 66 28 20 28 70 55 70 70 65 72 2d 3e 65    if( (pUpper->e
19ea0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
19eb0 29 21 3d 30 20 29 20 69 55 70 70 65 72 20 2b 3d  )!=0 ) iUpper +=
19ec0 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   a[1];.      }. 
19ed0 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
19ee0 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29  eFree(pRangeVal)
19ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19f00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19f10 0a 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65  .      if( iUppe
19f20 72 3c 3d 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20  r<=iLower ){.   
19f30 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20       *pRangeDiv 
19f40 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52  = (double)p->aiR
19f50 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20  owEst[0];.      
19f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
19f70 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75  pRangeDiv = (dou
19f80 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b  ble)p->aiRowEst[
19f90 30 5d 2f 28 64 6f 75 62 6c 65 29 28 69 55 70 70  0]/(double)(iUpp
19fa0 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20  er - iLower);.  
19fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 57 48      }.      /*WH
19fc0 45 52 45 54 52 41 43 45 28 28 22 72 61 6e 67 65  ERETRACE(("range
19fd0 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
19fe0 75 2e 2e 25 75 20 20 64 69 76 3d 25 67 5c 6e 22  u..%u  div=%g\n"
19ff0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a000 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c      (u32)iLower,
1a010 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 2a 70   (u32)iUpper, *p
1a020 52 61 6e 67 65 44 69 76 29 29 3b 2a 2f 0a 20 20  RangeDiv));*/.  
1a030 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a040 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1a050 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
1a060 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
1a070 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a080 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45  ETER(p);.  UNUSE
1a090 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 45 71 29  D_PARAMETER(nEq)
1a0a0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
1a0b0 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
1a0c0 70 65 72 20 29 3b 0a 20 20 2a 70 52 61 6e 67 65  per );.  *pRange
1a0d0 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  Div = (double)1;
1a0e0 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26  .  if( pLower &&
1a0f0 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67   (pLower->wtFlag
1a100 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1a110 3d 30 20 29 20 2a 70 52 61 6e 67 65 44 69 76 20  =0 ) *pRangeDiv 
1a120 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20  *= (double)4;.  
1a130 69 66 28 20 70 55 70 70 65 72 20 29 20 2a 70 52  if( pUpper ) *pR
1a140 61 6e 67 65 44 69 76 20 2a 3d 20 28 64 6f 75 62  angeDiv *= (doub
1a150 6c 65 29 34 3b 0a 20 20 72 65 74 75 72 6e 20 72  le)4;.  return r
1a160 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
1a170 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
1a180 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
1a190 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1a1a0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
1a1b0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
1a1c0 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
1a1d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
1a1e0 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
1a1f0 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
1a200 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
1a210 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
1a220 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
1a230 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
1a240 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
1a250 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
1a260 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
1a270 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
1a280 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
1a290 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
1a2a0 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
1a2b0 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
1a2c0 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
1a2d0 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
1a2e0 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
1a2f0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
1a300 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
1a310 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
1a320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a330 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
1a340 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
1a350 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
1a360 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
1a370 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
1a380 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
1a390 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
1a3a0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
1a3b0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
1a3c0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
1a3d0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
1a3e0 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
1a3f0 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
1a400 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
1a410 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
1a420 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
1a430 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
1a440 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
1a450 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
1a460 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1a470 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a480 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
1a490 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
1a4a0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
1a4b0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
1a4c0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1a4d0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
1a4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a4f0 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
1a500 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
1a510 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
1a520 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
1a530 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
1a540 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
1a550 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
1a560 6e 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a  nt */.  double *
1a570 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20  pnRow        /* 
1a580 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
1a590 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
1a5a0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
1a5b0 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20  te3_value *pRhs 
1a5c0 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f  = 0;  /* VALUE o
1a5d0 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
1a5e0 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20  e of pTerm */.  
1a5f0 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
1a600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1a610 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
1a620 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1a630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a640 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
1a650 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
1a660 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
1a670 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
1a680 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ics */..  assert
1a690 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
1a6a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1a6b0 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
1a6c0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
1a6d0 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
1a6e0 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  [0]].affinity;. 
1a6f0 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
1a700 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
1a710 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
1a720 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29 3b  pr, aff, &pRhs);
1a730 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
1a740 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  to whereEqualSca
1a750 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d  nEst_cancel;.  }
1a760 65 6c 73 65 7b 0a 20 20 20 20 70 52 68 73 20 3d  else{.    pRhs =
1a770 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
1a780 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
1a790 7d 0a 20 20 69 66 28 20 70 52 68 73 3d 3d 30 20  }.  if( pRhs==0 
1a7a0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a7b0 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d  NOTFOUND;.  rc =
1a7c0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
1a7d0 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20  Parse, p, pRhs, 
1a7e0 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, a);.  if( rc=
1a7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a800 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28    /*WHERETRACE((
1a810 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
1a820 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
1a830 69 6e 74 29 61 5b 31 5d 29 29 3b 2a 2f 0a 20 20  int)a[1]));*/.  
1a840 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
1a850 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61 6c 53  .  }.whereEqualS
1a860 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a 0a 20  canEst_cancel:. 
1a870 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
1a880 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74 75 72  e(pRhs);.  retur
1a890 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1a8a0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
1a8b0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a  _ENABLE_STAT3) *
1a8c0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
1a8d0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a  _ENABLE_STAT3./*
1a8e0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
1a8f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1a900 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
1a910 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
1a920 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
1a930 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
1a940 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
1a950 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
1a960 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
1a970 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
1a980 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
1a990 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
1a9a0 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
1a9b0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
1a9c0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
1a9d0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
1a9e0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
1a9f0 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
1aa00 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
1aa10 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
1aa20 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
1aa30 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
1aa40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1aa50 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
1aa60 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
1aa70 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
1aa80 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
1aa90 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
1aaa0 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
1aab0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
1aac0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
1aad0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
1aae0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
1aaf0 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
1ab00 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
1ab10 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
1ab20 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
1ab30 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
1ab40 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
1ab50 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
1ab60 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
1ab70 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1ab80 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
1ab90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1aba0 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
1abb0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1abc0 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20  n is pTerm */.  
1abd0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
1abe0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
1abf0 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48  e list on the RH
1ac00 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76  S of "x IN (v1,v
1ac10 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20  2,v3,...)" */.  
1ac20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20  double *pnRow   
1ac30 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1ac40 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
1ac50 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
1ac60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1ac70 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1ac80 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
1ac90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1aca0 64 6f 75 62 6c 65 20 6e 45 73 74 3b 20 20 20 20  double nEst;    
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1acc0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f  umber of rows fo
1acd0 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  r a single term 
1ace0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77  */.  double nRow
1acf0 45 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b  Est = (double)0;
1ad00 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65   /* New estimate
1ad10 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
1ad20 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20  f rows */.  int 
1ad30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1ad40 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1ad50 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
1ad60 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
1ad70 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
1ad80 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1ad90 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
1ada0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73  r; i++){.    nEs
1adb0 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
1adc0 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  0];.    rc = whe
1add0 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
1ade0 50 61 72 73 65 2c 20 70 2c 20 70 4c 69 73 74 2d  Parse, p, pList-
1adf0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45  >a[i].pExpr, &nE
1ae00 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  st);.    nRowEst
1ae10 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a 20 20   += nEst;.  }.  
1ae20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ae30 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f  K ){.    if( nRo
1ae40 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f 77 45  wEst > p->aiRowE
1ae50 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73 74 20  st[0] ) nRowEst 
1ae60 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  = p->aiRowEst[0]
1ae70 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e  ;.    *pnRow = n
1ae80 52 6f 77 45 73 74 3b 0a 20 20 20 20 2f 2a 57 48  RowEst;.    /*WH
1ae90 45 52 45 54 52 41 43 45 28 28 22 49 4e 20 72 6f  ERETRACE(("IN ro
1aea0 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
1aeb0 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %g\n", nRowEst))
1aec0 3b 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ;*/.  }.  return
1aed0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
1aee0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1aef0 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f  ENABLE_STAT3) */
1af00 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
1af10 20 73 65 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69   see if column i
1af20 43 6f 6c 20 6f 66 20 74 68 65 20 74 61 62 6c 65  Col of the table
1af30 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 54 61   with cursor iTa
1af40 62 20 77 69 6c 6c 20 61 70 70 65 61 72 0a 2a 2a  b will appear.**
1af50 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
1af60 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
1af70 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 20  e current query 
1af80 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  plan..**.** Retu
1af90 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a  rn values:.**.**
1afa0 20 20 20 20 30 20 20 20 69 43 6f 6c 20 69 73 20      0   iCol is 
1afb0 6e 6f 74 20 6f 72 64 65 72 65 64 0a 2a 2a 20 20  not ordered.**  
1afc0 20 20 31 20 20 20 69 43 6f 6c 20 68 61 73 20 6f    1   iCol has o
1afd0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c  nly a single val
1afe0 75 65 0a 2a 2a 20 20 20 20 32 20 20 20 69 43 6f  ue.**    2   iCo
1aff0 6c 20 69 73 20 69 6e 20 41 53 43 20 6f 72 64 65  l is in ASC orde
1b000 72 0a 2a 2a 20 20 20 20 33 20 20 20 69 43 6f 6c  r.**    3   iCol
1b010 20 69 73 20 69 6e 20 44 45 53 43 20 6f 72 64 65   is in DESC orde
1b020 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
1b030 69 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28  isOrderedColumn(
1b040 0a 20 20 57 68 65 72 65 42 65 73 74 49 64 78 20  .  WhereBestIdx 
1b050 2a 70 2c 0a 20 20 69 6e 74 20 69 54 61 62 2c 0a  *p,.  int iTab,.
1b060 20 20 69 6e 74 20 69 43 6f 6c 0a 29 7b 0a 20 20    int iCol.){.  
1b070 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 57 68 65 72  int i, j;.  Wher
1b080 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
1b090 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69   &p->aLevel[p->i
1b0a0 2d 31 5d 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  -1];.  Index *pI
1b0b0 64 78 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64  dx;.  u8 sortOrd
1b0c0 65 72 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 69  er;.  for(i=p->i
1b0d0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
1b0e0 4c 65 76 65 6c 2d 2d 29 7b 0a 20 20 20 20 69 66  Level--){.    if
1b0f0 28 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  ( pLevel->iTabCu
1b100 72 21 3d 69 54 61 62 20 29 20 63 6f 6e 74 69 6e  r!=iTab ) contin
1b110 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65  ue;.    if( (pLe
1b120 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1b130 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e  s & WHERE_ALL_UN
1b140 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  IQUE)!=0 ){.    
1b150 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1b160 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
1b170 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1b180 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
1b190 52 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 69  RED)!=0 );.    i
1b1a0 66 28 20 28 70 49 64 78 20 3d 20 70 4c 65 76 65  f( (pIdx = pLeve
1b1b0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 29 21  l->plan.u.pIdx)!
1b1c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1b1d0 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
1b1e0 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b    sortOrder = 0;
1b1f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1b200 65 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  e( (pLevel->plan
1b210 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1b220 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29 3b 0a  _REVERSE)!=0 );.
1b230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b240 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 64       int n = pId
1b250 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
1b260 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
1b270 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1b280 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78    if( iCol==pIdx
1b290 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 20  ->aiColumn[j] ) 
1b2a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1b2b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  .        if( j>=
1b2c0 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
1b2d0 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
1b2e0 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
1b2f0 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 74  er[j];.        t
1b300 65 73 74 63 61 73 65 28 20 28 70 4c 65 76 65 6c  estcase( (pLevel
1b310 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1b320 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21   WHERE_REVERSE)!
1b330 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1b340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1b350 66 28 20 69 43 6f 6c 21 3d 28 2d 31 29 20 29 20  f( iCol!=(-1) ) 
1b360 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1b370 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  sortOrder = 0;. 
1b380 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1b390 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1b3a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56  lags & WHERE_REV
1b3b0 45 52 53 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  ERSE)!=0 );.    
1b3c0 7d 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  }.    if( (pLeve
1b3d0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1b3e0 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
1b3f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
1b400 65 72 74 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d  ert( sortOrder==
1b410 30 20 7c 7c 20 73 6f 72 74 4f 72 64 65 72 3d 3d  0 || sortOrder==
1b420 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
1b430 61 73 65 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d  ase( sortOrder==
1b440 31 20 29 3b 0a 20 20 20 20 20 20 73 6f 72 74 4f  1 );.      sortO
1b450 72 64 65 72 20 3d 20 31 20 2d 20 73 6f 72 74 4f  rder = 1 - sortO
1b460 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rder;.    }.    
1b470 72 65 74 75 72 6e 20 73 6f 72 74 4f 72 64 65 72  return sortOrder
1b480 2b 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +2;.  }.  return
1b490 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1b4a0 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65  s routine decide
1b4b0 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65  s if pIdx can be
1b4c0 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79   used to satisfy
1b4d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
1b4e0 20 63 6c 61 75 73 65 2c 20 65 69 74 68 65 72 20   clause, either 
1b4f0 69 6e 20 77 68 6f 6c 65 20 6f 72 20 69 6e 20 70  in whole or in p
1b500 61 72 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  art.  The return
1b510 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 0a 2a   value is the .*
1b520 2a 20 63 75 6d 75 6c 61 74 69 76 65 20 6e 75 6d  * cumulative num
1b530 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
1b540 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1b550 75 73 65 20 74 68 61 74 20 61 72 65 20 73 61 74  use that are sat
1b560 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65  isfied.** by the
1b570 20 69 6e 64 65 78 20 70 49 64 78 20 61 6e 64 20   index pIdx and 
1b580 6f 74 68 65 72 20 69 6e 64 69 63 65 73 20 69 6e  other indices in
1b590 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 0a 2a 2a   outer loops..**
1b5a0 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65  .** The table be
1b5b0 69 6e 67 20 71 75 65 72 69 65 64 20 68 61 73 20  ing queried has 
1b5c0 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  a cursor number 
1b5d0 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64 78  of "base".  pIdx
1b5e0 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78   is the.** index
1b5f0 20 74 68 61 74 20 69 73 20 70 6f 73 74 75 6c 61   that is postula
1b600 74 65 64 20 66 6f 72 20 75 73 65 20 74 6f 20 61  ted for use to a
1b610 63 63 65 73 73 20 74 68 65 20 74 61 62 6c 65 2e  ccess the table.
1b620 0a 2a 2a 0a 2a 2a 20 54 68 65 20 2a 70 62 52 65  .**.** The *pbRe
1b630 76 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  v value is set t
1b640 6f 20 30 20 6f 72 64 65 72 20 31 20 64 65 70 65  o 0 order 1 depe
1b650 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1b660 20 6f 72 20 6e 6f 74 0a 2a 2a 20 70 49 64 78 20   or not.** pIdx 
1b670 73 68 6f 75 6c 64 20 62 65 20 72 75 6e 20 69 6e  should be run in
1b680 20 74 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64   the forward ord
1b690 65 72 20 6f 72 20 69 6e 20 72 65 76 65 72 73 65  er or in reverse
1b6a0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
1b6b0 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49  c int isSortingI
1b6c0 6e 64 65 78 28 0a 20 20 57 68 65 72 65 42 65 73  ndex(.  WhereBes
1b6d0 74 49 64 78 20 2a 70 2c 20 20 20 20 2f 2a 20 42  tIdx *p,    /* B
1b6e0 65 73 74 20 69 6e 64 65 78 20 73 65 61 72 63 68  est index search
1b6f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
1b700 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
1b710 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
1b720 65 20 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f  e are testing */
1b730 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20  .  int base,    
1b740 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
1b750 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1b760 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
1b770 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  ed */.  int *pbR
1b780 65 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ev,         /* S
1b790 65 74 20 74 6f 20 31 20 66 6f 72 20 72 65 76 65  et to 1 for reve
1b7a0 72 73 65 2d 6f 72 64 65 72 20 73 63 61 6e 20 6f  rse-order scan o
1b7b0 66 20 70 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20  f pIdx */.  int 
1b7c0 2a 70 62 4f 62 55 6e 69 71 75 65 20 20 20 20 20  *pbObUnique     
1b7d0 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  /* ORDER BY colu
1b7e0 6d 6e 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 64  mn values will d
1b7f0 69 66 66 65 72 65 6e 74 20 69 6e 20 65 76 65 72  ifferent in ever
1b800 79 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20 20 69 6e  y row */.){.  in
1b810 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1b820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b830 75 6d 62 65 72 20 6f 66 20 70 49 64 78 20 74 65  umber of pIdx te
1b840 72 6d 73 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e  rms used */.  in
1b850 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
1b860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b870 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
1b880 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65  Y terms satisfie
1b890 64 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  d */.  int sortO
1b8a0 72 64 65 72 20 3d 20 32 3b 20 20 20 20 20 20 20  rder = 2;       
1b8b0 20 20 20 20 20 2f 2a 20 30 3a 20 66 6f 72 77 61       /* 0: forwa
1b8c0 72 64 2e 20 20 31 3a 20 62 61 63 6b 77 61 72 64  rd.  1: backward
1b8d0 2e 20 20 32 3a 20 75 6e 6b 6e 6f 77 6e 20 2a 2f  .  2: unknown */
1b8e0 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20  .  int nTerm;   
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
1b910 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
1b920 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1b930 74 5f 69 74 65 6d 20 2a 70 4f 42 49 74 65 6d 3b  t_item *pOBItem;
1b940 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
1b950 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b960 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1b970 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1b980 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 61  ;   /* Table tha
1b990 74 20 6f 77 6e 73 20 69 6e 64 65 78 20 70 49 64  t owns index pId
1b9a0 78 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  x */.  ExprList 
1b9b0 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
1b9c0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
1b9d0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
1b9e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
1b9f0 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 2f   p->pParse;    /
1ba00 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
1ba10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1ba20 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1ba30 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1ba40 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1ba50 69 6e 74 20 6e 50 72 69 6f 72 53 61 74 3b 20 20  int nPriorSat;  
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ba70 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1ba80 73 61 74 69 73 66 69 65 64 20 62 79 20 6f 75 74  satisfied by out
1ba90 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 69 6e  er loops */.  in
1baa0 74 20 73 65 65 6e 52 6f 77 69 64 20 3d 20 30 3b  t seenRowid = 0;
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bac0 72 75 65 20 69 66 20 61 6e 20 4f 52 44 45 52 20  rue if an ORDER 
1bad0 42 59 20 72 6f 77 69 64 20 74 65 72 6d 20 69 73  BY rowid term is
1bae0 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 75   seen */.  int u
1baf0 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 3b 20 20 20  niqueNotNull;   
1bb00 20 20 20 20 20 20 20 20 20 2f 2a 20 70 49 64 78           /* pIdx
1bb10 20 69 73 20 55 4e 49 51 55 45 20 77 69 74 68 20   is UNIQUE with 
1bb20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 4e 4f  all terms are NO
1bb30 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  T NULL */.  int 
1bb40 6f 75 74 65 72 4f 62 55 6e 69 71 75 65 3b 20 20  outerObUnique;  
1bb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
1bb60 65 72 20 6c 6f 6f 70 73 20 67 65 6e 65 72 61 74  er loops generat
1bb70 65 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c 75  e different valu
1bb80 65 73 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  es in.          
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bba0 20 20 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72        ** every r
1bbb0 6f 77 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  ow for the ORDER
1bbc0 20 42 59 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a   BY columns */..
1bbd0 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30 20 29 7b    if( p->i==0 ){
1bbe0 0a 20 20 20 20 6e 50 72 69 6f 72 53 61 74 20 3d  .    nPriorSat =
1bbf0 20 30 3b 0a 20 20 20 20 6f 75 74 65 72 4f 62 55   0;.    outerObU
1bc00 6e 69 71 75 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  nique = 1;.  }el
1bc10 73 65 7b 0a 20 20 20 20 75 33 32 20 77 73 46 6c  se{.    u32 wsFl
1bc20 61 67 73 20 3d 20 70 2d 3e 61 4c 65 76 65 6c 5b  ags = p->aLevel[
1bc30 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 77 73 46  p->i-1].plan.wsF
1bc40 6c 61 67 73 3b 0a 20 20 20 20 6e 50 72 69 6f 72  lags;.    nPrior
1bc50 53 61 74 20 3d 20 70 2d 3e 61 4c 65 76 65 6c 5b  Sat = p->aLevel[
1bc60 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f 42  p->i-1].plan.nOB
1bc70 53 61 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73  Sat;.    if( (ws
1bc80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
1bc90 44 45 52 45 44 29 3d 3d 30 20 29 7b 0a 20 20 20  DERED)==0 ){.   
1bca0 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20     /* This loop 
1bcb0 63 61 6e 6e 6f 74 20 62 65 20 6f 72 64 65 72 65  cannot be ordere
1bcc0 64 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 78  d unless the nex
1bcd0 74 20 6f 75 74 65 72 20 6c 6f 6f 70 20 69 73 0a  t outer loop is.
1bce0 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6f 72        ** also or
1bcf0 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 72  dered */.      r
1bd00 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b  eturn nPriorSat;
1bd10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 4f  .    }.    if( O
1bd20 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
1bd30 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
1bd40 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29  rderByIdxJoin) )
1bd50 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  {.      /* Only 
1bd60 6c 6f 6f 6b 20 61 74 20 74 68 65 20 6f 75 74 65  look at the oute
1bd70 72 2d 6d 6f 73 74 20 6c 6f 6f 70 20 69 66 20 74  r-most loop if t
1bd80 68 65 20 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  he OrderByIdxJoi
1bd90 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d  n.      ** optim
1bda0 69 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62  ization is disab
1bdb0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  led */.      ret
1bdc0 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20  urn nPriorSat;. 
1bdd0 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
1bde0 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45  e( wsFlags & WHE
1bdf0 52 45 5f 4f 42 5f 55 4e 49 51 55 45 20 29 3b 0a  RE_OB_UNIQUE );.
1be00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73      testcase( ws
1be10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c  Flags & WHERE_AL
1be20 4c 5f 55 4e 49 51 55 45 20 29 3b 0a 20 20 20 20  L_UNIQUE );.    
1be30 6f 75 74 65 72 4f 62 55 6e 69 71 75 65 20 3d 20  outerObUnique = 
1be40 28 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  (wsFlags & (WHER
1be50 45 5f 4f 42 5f 55 4e 49 51 55 45 7c 57 48 45 52  E_OB_UNIQUE|WHER
1be60 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29 29 21 3d  E_ALL_UNIQUE))!=
1be70 30 3b 0a 20 20 7d 0a 20 20 70 4f 72 64 65 72 42  0;.  }.  pOrderB
1be80 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1be90 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
1bea0 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  rBy!=0 );.  if( 
1beb0 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
1bec0 20 29 7b 0a 20 20 20 20 2f 2a 20 48 61 73 68 20   ){.    /* Hash 
1bed0 69 6e 64 69 63 65 73 20 28 69 6e 64 69 63 61 74  indices (indicat
1bee0 65 64 20 62 79 20 74 68 65 20 22 75 6e 6f 72 64  ed by the "unord
1bef0 65 72 65 64 22 20 74 61 67 20 6f 6e 20 73 71 6c  ered" tag on sql
1bf00 69 74 65 5f 73 74 61 74 31 29 20 63 61 6e 6e 6f  ite_stat1) canno
1bf10 74 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64  t.    ** be used
1bf20 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 2a 2f 0a   for sorting */.
1bf30 20 20 20 20 72 65 74 75 72 6e 20 6e 50 72 69 6f      return nPrio
1bf40 72 53 61 74 3b 0a 20 20 7d 0a 20 20 6e 54 65 72  rSat;.  }.  nTer
1bf50 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  m = pOrderBy->nE
1bf60 78 70 72 3b 0a 20 20 75 6e 69 71 75 65 4e 6f 74  xpr;.  uniqueNot
1bf70 4e 75 6c 6c 20 3d 20 70 49 64 78 2d 3e 6f 6e 45  Null = pIdx->onE
1bf80 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
1bf90 20 61 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30   assert( nTerm>0
1bfa0 20 29 3b 0a 0a 20 20 2f 2a 20 41 72 67 75 6d 65   );..  /* Argume
1bfb0 6e 74 20 70 49 64 78 20 6d 75 73 74 20 65 69 74  nt pIdx must eit
1bfc0 68 65 72 20 70 6f 69 6e 74 20 74 6f 20 61 20 27  her point to a '
1bfd0 72 65 61 6c 27 20 6e 61 6d 65 64 20 69 6e 64 65  real' named inde
1bfe0 78 20 73 74 72 75 63 74 75 72 65 2c 20 0a 20 20  x structure, .  
1bff0 2a 2a 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 73  ** or an index s
1c000 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
1c010 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  ed on the stack 
1c020 62 79 20 62 65 73 74 42 74 72 65 65 49 6e 64 65  by bestBtreeInde
1c030 78 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 70 72  x() to.  ** repr
1c040 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
1c050 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 70 61  index that is pa
1c060 72 74 20 6f 66 20 65 76 65 72 79 20 74 61 62 6c  rt of every tabl
1c070 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
1c080 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20   pIdx->zName || 
1c090 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  (pIdx->nColumn==
1c0a0 31 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c  1 && pIdx->aiCol
1c0b0 75 6d 6e 5b 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a  umn[0]==-1) );..
1c0c0 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73    /* Match terms
1c0d0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1c0e0 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20   clause against 
1c0f0 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20  columns of.  ** 
1c100 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  the index..  **.
1c110 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69    ** Note that i
1c120 6e 64 69 63 65 73 20 68 61 76 65 20 70 49 64 78  ndices have pIdx
1c130 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61  ->nColumn regula
1c140 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20  r columns plus. 
1c150 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e   ** one addition
1c160 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  al column contai
1c170 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2e 20  ning the rowid. 
1c180 20 54 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   The rowid colum
1c190 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e  n.  ** of the in
1c1a0 64 65 78 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f  dex is also allo
1c1b0 77 65 64 20 74 6f 20 6d 61 74 63 68 20 61 67 61  wed to match aga
1c1c0 69 6e 73 74 20 74 68 65 20 4f 52 44 45 52 20 42  inst the ORDER B
1c1d0 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20  Y.  ** clause.. 
1c1e0 20 2a 2f 0a 20 20 6a 20 3d 20 6e 50 72 69 6f 72   */.  j = nPrior
1c1f0 53 61 74 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 70  Sat;.  for(i=0,p
1c200 4f 42 49 74 65 6d 3d 26 70 4f 72 64 65 72 42 79  OBItem=&pOrderBy
1c210 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 65 72 6d 20  ->a[j]; j<nTerm 
1c220 26 26 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c  && i<=pIdx->nCol
1c230 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  umn; i++){.    E
1c240 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
1c250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
1c260 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
1c270 4f 52 44 45 52 20 42 59 20 70 4f 42 49 74 65 6d  ORDER BY pOBItem
1c280 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
1c290 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
1c2a0 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  /* The collating
1c2b0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 70 4f 42   sequence of pOB
1c2c0 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Expr */.    int 
1c2d0 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20 20  termSortOrder;  
1c2e0 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
1c2f0 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  r for this term 
1c300 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
1c310 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn;            /
1c320 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  * The i-th colum
1c330 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
1c340 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f   -1 for rowid */
1c350 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72  .    int iSortOr
1c360 64 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  der;         /* 
1c370 31 20 66 6f 72 20 44 45 53 43 2c 20 30 20 66 6f  1 for DESC, 0 fo
1c380 72 20 41 53 43 20 6f 6e 20 74 68 65 20 69 2d 74  r ASC on the i-t
1c390 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a  h index term */.
1c3a0 20 20 20 20 69 6e 74 20 69 73 45 71 3b 20 20 20      int isEq;   
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c3c0 75 62 6a 65 63 74 20 74 6f 20 61 6e 20 3d 3d 20  ubject to an == 
1c3d0 6f 72 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74  or IS NULL const
1c3e0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  raint */.    int
1c3f0 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
1c400 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
1c410 20 74 65 72 6d 20 6d 61 74 63 68 65 73 20 74 68   term matches th
1c420 65 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a  e index term */.
1c430 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c440 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4e  zColl;      /* N
1c450 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67  ame of collating
1c460 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 69 2d   sequence for i-
1c470 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f  th index term */
1c480 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1c490 70 43 6f 6e 73 74 72 61 69 6e 74 3b 20 2f 2a 20  pConstraint; /* 
1c4a0 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  A constraint in 
1c4b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1c4c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   */..    /* If t
1c4d0 68 65 20 6e 65 78 74 20 74 65 72 6d 20 6f 66 20  he next term of 
1c4e0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c4f0 75 73 65 20 72 65 66 65 72 73 20 74 6f 20 61 6e  use refers to an
1c500 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
1c510 6e 0a 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d  n.    ** a colum
1c520 6e 20 69 6e 20 74 68 65 20 22 62 61 73 65 22 20  n in the "base" 
1c530 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 69 73  table, then this
1c540 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
1c550 62 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 2a 2a  be of any.    **
1c560 20 66 75 72 74 68 65 72 20 75 73 65 20 69 6e 20   further use in 
1c570 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 4f 52 44  handling the ORD
1c580 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20 20 70 4f  ER BY. */.    pO
1c590 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
1c5a0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
1c5b0 4f 42 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  OBItem->pExpr);.
1c5c0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1c5d0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
1c5e0 7c 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  | pOBExpr->iTabl
1c5f0 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20  e!=base ){.     
1c600 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1c610 20 20 20 2f 2a 20 46 69 6e 64 20 63 6f 6c 75 6d     /* Find colum
1c620 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c  n number and col
1c630 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1c640 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6e 74  for the next ent
1c650 72 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ry.    ** in the
1c660 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 66   index */.    if
1c670 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26 26  ( pIdx->zName &&
1c680 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
1c690 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d   ){.      iColum
1c6a0 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  n = pIdx->aiColu
1c6b0 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  mn[i];.      if(
1c6c0 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e   iColumn==pIdx->
1c6d0 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b  pTable->iPKey ){
1c6e0 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  .        iColumn
1c6f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
1c700 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20       iSortOrder 
1c710 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
1c720 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43 6f  er[i];.      zCo
1c730 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
1c740 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  l[i];.      asse
1c750 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a  rt( zColl!=0 );.
1c760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c770 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
1c780 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20       iSortOrder 
1c790 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  = 0;.      zColl
1c7a0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
1c7b0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1c7c0 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   if the column n
1c7d0 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 6c 61 74  umber and collat
1c7e0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
1c7f0 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  the.    ** index
1c800 20 6d 61 74 63 68 20 74 68 65 20 63 6f 6c 75 6d   match the colum
1c810 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c  n number and col
1c820 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1c830 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  of the ORDER BY.
1c840 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 65 6e      ** clause en
1c850 74 72 79 2e 20 20 53 65 74 20 69 73 4d 61 74 63  try.  Set isMatc
1c860 68 20 74 6f 20 31 20 69 66 20 74 68 65 79 20 62  h to 1 if they b
1c870 6f 74 68 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20  oth match. */.  
1c880 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
1c890 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
1c8a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  ){.      if( zCo
1c8b0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
1c8c0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1c8d0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1c8e0 20 70 4f 42 49 74 65 6d 2d 3e 70 45 78 70 72 29   pOBItem->pExpr)
1c8f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
1c900 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
1c910 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1c920 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
1c930 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1c940 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  Coll->zName, zCo
1c950 6c 6c 29 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 65  ll)==0;.      }e
1c960 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 4d  lse{.        isM
1c970 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
1c980 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1c990 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
1c9a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 74 65      }..    /* te
1c9b0 72 6d 53 6f 72 74 4f 72 64 65 72 20 69 73 20 30  rmSortOrder is 0
1c9c0 20 6f 72 20 31 20 66 6f 72 20 77 68 65 74 68 65   or 1 for whethe
1c9d0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 63 63  r or not the acc
1c9e0 65 73 73 20 6c 6f 6f 70 20 73 68 6f 75 6c 64 0a  ess loop should.
1c9f0 20 20 20 20 2a 2a 20 72 75 6e 20 66 6f 72 77 61      ** run forwa
1ca00 72 64 20 6f 72 20 62 61 63 6b 77 61 72 64 73 20  rd or backwards 
1ca10 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 20 69  (respectively) i
1ca20 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 74 69 73  n order to satis
1ca30 66 79 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20  fy this .    ** 
1ca40 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
1ca50 52 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a  R BY clause. */.
1ca60 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 42 49      assert( pOBI
1ca70 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d  tem->sortOrder==
1ca80 30 20 7c 7c 20 70 4f 42 49 74 65 6d 2d 3e 73 6f  0 || pOBItem->so
1ca90 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20  rtOrder==1 );.  
1caa0 20 20 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f    assert( iSortO
1cab0 72 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74  rder==0 || iSort
1cac0 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20  Order==1 );.    
1cad0 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20  termSortOrder = 
1cae0 69 53 6f 72 74 4f 72 64 65 72 20 5e 20 70 4f 42  iSortOrder ^ pOB
1caf0 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
1cb00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 58 20 69 73  ..    /* If X is
1cb10 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74   the column in t
1cb20 68 65 20 69 6e 64 65 78 20 61 6e 64 20 4f 52 44  he index and ORD
1cb30 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 63 68  ER BY clause, ch
1cb40 65 63 6b 20 74 6f 20 73 65 65 0a 20 20 20 20 2a  eck to see.    *
1cb50 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  * if there are a
1cb60 6e 79 20 58 3d 20 6f 72 20 58 20 49 53 20 4e 55  ny X= or X IS NU
1cb70 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  LL constraints i
1cb80 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
1cb90 73 65 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6e 73  se. */.    pCons
1cba0 74 72 61 69 6e 74 20 3d 20 66 69 6e 64 54 65 72  traint = findTer
1cbb0 6d 28 70 2d 3e 70 57 43 2c 20 62 61 73 65 2c 20  m(p->pWC, base, 
1cbc0 69 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 6e 6f 74 52  iColumn, p->notR
1cbd0 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20  eady,.          
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbf0 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c   WO_EQ|WO_ISNULL
1cc00 7c 57 4f 5f 49 4e 2c 20 70 49 64 78 29 3b 0a 20  |WO_IN, pIdx);. 
1cc10 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69     if( pConstrai
1cc20 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  nt==0 ){.      i
1cc30 73 45 71 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  sEq = 0;.    }el
1cc40 73 65 20 69 66 28 20 28 70 43 6f 6e 73 74 72 61  se if( (pConstra
1cc50 69 6e 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  int->eOperator &
1cc60 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
1cc70 20 20 20 20 69 73 45 71 20 3d 20 30 3b 0a 20 20      isEq = 0;.  
1cc80 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 43 6f    }else if( (pCo
1cc90 6e 73 74 72 61 69 6e 74 2d 3e 65 4f 70 65 72 61  nstraint->eOpera
1cca0 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29  tor & WO_ISNULL)
1ccb0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69  !=0 ){.      uni
1ccc0 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  queNotNull = 0;.
1ccd0 20 20 20 20 20 20 69 73 45 71 20 3d 20 31 3b 20        isEq = 1; 
1cce0 20 2f 2a 20 22 58 20 49 53 20 4e 55 4c 4c 22 20   /* "X IS NULL" 
1ccf0 6d 65 61 6e 73 20 58 20 68 61 73 20 6f 6e 6c 79  means X has only
1cd00 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
1cd10 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
1cd20 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 70 72   pConstraint->pr
1cd30 65 72 65 71 52 69 67 68 74 3d 3d 30 20 29 7b 0a  ereqRight==0 ){.
1cd40 20 20 20 20 20 20 69 73 45 71 20 3d 20 31 3b 20        isEq = 1; 
1cd50 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 22   /* Constraint "
1cd60 58 3d 63 6f 6e 73 74 61 6e 74 22 20 6d 65 61 6e  X=constant" mean
1cd70 73 20 58 20 68 61 73 20 6f 6e 6c 79 20 61 20 73  s X has only a s
1cd80 69 6e 67 6c 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ingle value */. 
1cd90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cda0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1cdb0 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 70 45 78 70  Constraint->pExp
1cdc0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1cdd0 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d   if( pRight->op=
1cde0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1cdf0 20 20 20 20 20 20 2f 2a 57 48 45 52 45 54 52 41        /*WHERETRA
1ce00 43 45 28 28 22 20 20 20 20 20 20 20 2e 2e 20 69  CE(("       .. i
1ce10 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28 74  sOrderedColumn(t
1ce20 61 62 3d 25 64 2c 63 6f 6c 3d 25 64 29 22 2c 0a  ab=%d,col=%d)",.
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce40 20 20 20 20 70 52 69 67 68 74 2d 3e 69 54 61 62      pRight->iTab
1ce50 6c 65 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  le, pRight->iCol
1ce60 75 6d 6e 29 29 3b 2a 2f 0a 20 20 20 20 20 20 20  umn));*/.       
1ce70 20 69 73 45 71 20 3d 20 69 73 4f 72 64 65 72 65   isEq = isOrdere
1ce80 64 43 6f 6c 75 6d 6e 28 70 2c 20 70 52 69 67 68  dColumn(p, pRigh
1ce90 74 2d 3e 69 54 61 62 6c 65 2c 20 70 52 69 67 68  t->iTable, pRigh
1cea0 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t->iColumn);.   
1ceb0 20 20 20 20 20 2f 2a 57 48 45 52 45 54 52 41 43       /*WHERETRAC
1cec0 45 28 28 22 20 2d 3e 20 69 73 45 71 3d 25 64 5c  E((" -> isEq=%d\
1ced0 6e 22 2c 20 69 73 45 71 29 29 3b 2a 2f 0a 0a 20  n", isEq));*/.. 
1cee0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1cef0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f   constraint is o
1cf00 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 59 20 77  f the form X=Y w
1cf10 68 65 72 65 20 59 20 69 73 20 61 6e 20 6f 72 64  here Y is an ord
1cf20 65 72 65 64 20 76 61 6c 75 65 0a 20 20 20 20 20  ered value.     
1cf30 20 20 20 2a 2a 20 69 6e 20 61 6e 20 6f 75 74 65     ** in an oute
1cf40 72 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 6d 61 6b  r loop, then mak
1cf50 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20  e sure the sort 
1cf60 6f 72 64 65 72 20 6f 66 20 59 20 6d 61 74 63 68  order of Y match
1cf70 65 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  es the.        *
1cf80 2a 20 73 6f 72 74 20 6f 72 64 65 72 20 72 65 71  * sort order req
1cf90 75 69 72 65 64 20 66 6f 72 20 58 2e 20 2a 2f 0a  uired for X. */.
1cfa0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61          if( isMa
1cfb0 74 63 68 20 26 26 20 69 73 45 71 3e 3d 32 20 26  tch && isEq>=2 &
1cfc0 26 20 69 73 45 71 21 3d 70 4f 42 49 74 65 6d 2d  & isEq!=pOBItem-
1cfd0 3e 73 6f 72 74 4f 72 64 65 72 2b 32 20 29 7b 0a  >sortOrder+2 ){.
1cfe0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1cff0 73 65 28 20 69 73 45 71 3d 3d 32 20 29 3b 0a 20  se( isEq==2 );. 
1d000 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1d010 65 28 20 69 73 45 71 3d 3d 33 20 29 3b 0a 20 20  e( isEq==3 );.  
1d020 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d040 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
1d050 45 71 20 3d 20 30 3b 20 20 2f 2a 20 22 58 3d 65  Eq = 0;  /* "X=e
1d060 78 70 72 22 20 70 6c 61 63 65 73 20 6e 6f 20 6f  xpr" places no o
1d070 72 64 65 72 69 6e 67 20 63 6f 6e 73 74 72 61 69  rdering constrai
1d080 6e 74 73 20 6f 6e 20 58 20 2a 2f 0a 20 20 20 20  nts on X */.    
1d090 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1d0a0 28 20 21 69 73 4d 61 74 63 68 20 29 7b 0a 20 20  ( !isMatch ){.  
1d0b0 20 20 20 20 69 66 28 20 69 73 45 71 3d 3d 30 20      if( isEq==0 
1d0c0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1d0d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d0e0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1d0f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1d100 73 65 20 69 66 28 20 69 73 45 71 21 3d 31 20 29  se if( isEq!=1 )
1d110 7b 0a 20 20 20 20 20 20 69 66 28 20 73 6f 72 74  {.      if( sort
1d120 4f 72 64 65 72 3d 3d 32 20 29 7b 0a 20 20 20 20  Order==2 ){.    
1d130 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
1d140 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20  termSortOrder;. 
1d150 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74       }else if( t
1d160 65 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f  ermSortOrder!=so
1d170 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  rtOrder ){.     
1d180 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d190 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  }.    }.    j++;
1d1a0 0a 20 20 20 20 70 4f 42 49 74 65 6d 2b 2b 3b 0a  .    pOBItem++;.
1d1b0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
1d1c0 30 20 29 7b 0a 20 20 20 20 20 20 73 65 65 6e 52  0 ){.      seenR
1d1d0 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  owid = 1;.      
1d1e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
1d1f0 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
1d200 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
1d210 3d 3d 30 20 26 26 20 69 73 45 71 21 3d 31 20 29  ==0 && isEq!=1 )
1d220 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1d230 28 20 69 73 45 71 3d 3d 30 20 29 3b 0a 20 20 20  ( isEq==0 );.   
1d240 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 45     testcase( isE
1d250 71 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20 74 65  q==2 );.      te
1d260 73 74 63 61 73 65 28 20 69 73 45 71 3d 3d 33 20  stcase( isEq==3 
1d270 29 3b 0a 20 20 20 20 20 20 75 6e 69 71 75 65 4e  );.      uniqueN
1d280 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1d290 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 65 65 6e  }.  }.  if( seen
1d2a0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  Rowid ){.    uni
1d2b0 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a  queNotNull = 1;.
1d2c0 20 20 7d 65 6c 73 65 20 69 66 28 20 75 6e 69 71    }else if( uniq
1d2d0 75 65 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 7c 7c 20  ueNotNull==0 || 
1d2e0 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  i<pIdx->nColumn 
1d2f0 29 7b 0a 20 20 20 20 75 6e 69 71 75 65 4e 6f 74  ){.    uniqueNot
1d300 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Null = 0;.  }.. 
1d310 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e   /* If we have n
1d320 6f 74 20 66 6f 75 6e 64 20 61 74 20 6c 65 61 73  ot found at leas
1d330 74 20 6f 6e 65 20 4f 52 44 45 52 20 42 59 20 74  t one ORDER BY t
1d340 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65 73  erm that matches
1d350 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2c   the.  ** index,
1d360 20 74 68 65 6e 20 73 68 6f 77 20 6e 6f 20 70 72   then show no pr
1d370 6f 67 72 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  ogress. */.  if(
1d380 20 70 4f 42 49 74 65 6d 3d 3d 26 70 4f 72 64 65   pOBItem==&pOrde
1d390 72 42 79 2d 3e 61 5b 6e 50 72 69 6f 72 53 61 74  rBy->a[nPriorSat
1d3a0 5d 20 29 20 72 65 74 75 72 6e 20 6e 50 72 69 6f  ] ) return nPrio
1d3b0 72 53 61 74 3b 0a 0a 20 20 2f 2a 20 45 69 74 68  rSat;..  /* Eith
1d3c0 65 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  er the outer que
1d3d0 72 69 65 73 20 6d 75 73 74 20 67 65 6e 65 72 61  ries must genera
1d3e0 74 65 20 72 6f 77 73 20 77 68 65 72 65 20 74 68  te rows where th
1d3f0 65 72 65 20 61 72 65 20 6e 6f 20 74 77 6f 0a 20  ere are no two. 
1d400 20 2a 2a 20 72 6f 77 73 20 77 69 74 68 20 74 68   ** rows with th
1d410 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 69 6e  e same values in
1d420 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 63 6f   all ORDER BY co
1d430 6c 75 6d 6e 73 2c 20 6f 72 20 65 6c 73 65 20 74  lumns, or else t
1d440 68 69 73 0a 20 20 2a 2a 20 6c 6f 6f 70 20 6d 75  his.  ** loop mu
1d450 73 74 20 67 65 6e 65 72 61 74 65 20 6a 75 73 74  st generate just
1d460 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
1d470 20 6f 75 74 70 75 74 2e 20 20 45 78 61 6d 70 6c   output.  Exampl
1d480 65 3a 20 20 53 75 70 70 6f 73 65 0a 20 20 2a 2a  e:  Suppose.  **
1d490 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 73   the outer loops
1d4a0 20 67 65 6e 65 72 61 74 65 20 41 3d 31 20 61 6e   generate A=1 an
1d4b0 64 20 41 3d 31 2c 20 61 6e 64 20 74 68 69 73 20  d A=1, and this 
1d4c0 6c 6f 6f 70 20 67 65 6e 65 72 61 74 65 73 20 42  loop generates B
1d4d0 3d 33 0a 20 20 2a 2a 20 61 6e 64 20 42 3d 34 2e  =3.  ** and B=4.
1d4e0 20 20 54 68 65 6e 20 77 69 74 68 6f 75 74 20 74    Then without t
1d4f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
1d500 74 2c 20 4f 52 44 45 52 20 42 59 20 41 2c 42 20  t, ORDER BY A,B 
1d510 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 67 65 6e 65  would .  ** gene
1d520 72 61 74 65 20 74 68 65 20 77 72 6f 6e 67 20 6f  rate the wrong o
1d530 72 64 65 72 20 6f 75 74 70 75 74 3a 20 31 2c 33  rder output: 1,3
1d540 20 31 2c 34 20 31 2c 33 20 31 2c 34 0a 20 20 2a   1,4 1,3 1,4.  *
1d550 2f 0a 20 20 69 66 28 20 6f 75 74 65 72 4f 62 55  /.  if( outerObU
1d560 6e 69 71 75 65 3d 3d 30 20 26 26 20 75 6e 69 71  nique==0 && uniq
1d570 75 65 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 72  ueNotNull==0 ) r
1d580 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b  eturn nPriorSat;
1d590 0a 20 20 2a 70 62 4f 62 55 6e 69 71 75 65 20 3d  .  *pbObUnique =
1d5a0 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 3b 0a   uniqueNotNull;.
1d5b0 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  .  /* Return the
1d5c0 20 6e 65 63 65 73 73 61 72 79 20 73 63 61 6e 20   necessary scan 
1d5d0 6f 72 64 65 72 20 62 61 63 6b 20 74 6f 20 74 68  order back to th
1d5e0 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 2a 70  e caller */.  *p
1d5f0 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
1d600 20 26 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   & 1;..  /* If t
1d610 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
1d620 45 52 20 42 59 20 72 6f 77 69 64 22 20 74 65 72  ER BY rowid" ter
1d630 6d 20 74 68 61 74 20 6d 61 74 63 68 65 64 2c 20  m that matched, 
1d640 6f 72 20 69 74 20 69 73 20 6f 6e 6c 79 0a 20 20  or it is only.  
1d650 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
1d660 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 72 6f  a single row fro
1d670 6d 20 74 68 69 73 20 74 61 62 6c 65 20 74 6f 20  m this table to 
1d680 6d 61 74 63 68 2c 20 74 68 65 6e 20 73 6b 69 70  match, then skip
1d690 20 6f 76 65 72 0a 20 20 2a 2a 20 61 6e 79 20 61   over.  ** any a
1d6a0 64 64 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52 20  dditional ORDER 
1d6b0 42 59 20 74 65 72 6d 73 20 64 65 61 6c 69 6e 67  BY terms dealing
1d6c0 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
1d6d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 75 6e 69  ..  */.  if( uni
1d6e0 71 75 65 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  queNotNull ){.  
1d6f0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 6a 20 6f    /* Advance j o
1d700 76 65 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 4f  ver additional O
1d710 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 61 73  RDER BY terms as
1d720 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 62 61  sociated with ba
1d730 73 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4d  se */.    WhereM
1d740 61 73 6b 53 65 74 20 2a 70 4d 53 20 3d 20 70 2d  askSet *pMS = p-
1d750 3e 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a  >pWC->pMaskSet;.
1d760 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
1d770 7e 67 65 74 4d 61 73 6b 28 70 4d 53 2c 20 62 61  ~getMask(pMS, ba
1d780 73 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  se);.    while( 
1d790 6a 3c 6e 54 65 72 6d 20 26 26 20 28 65 78 70 72  j<nTerm && (expr
1d7a0 54 61 62 6c 65 55 73 61 67 65 28 70 4d 53 2c 20  TableUsage(pMS, 
1d7b0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a 5d 2e 70  pOrderBy->a[j].p
1d7c0 45 78 70 72 29 26 6d 29 3d 3d 30 20 29 7b 0a 20  Expr)&m)==0 ){. 
1d7d0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
1d7e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a    }.  return j;.
1d7f0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
1d800 65 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61  e best query pla
1d810 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  n for accessing 
1d820 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  a particular tab
1d830 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  le.  Write the.*
1d840 2a 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61  * best query pla
1d850 6e 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69  n and its cost i
1d860 6e 74 6f 20 74 68 65 20 70 2d 3e 63 6f 73 74 2e  nto the p->cost.
1d870 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73  .**.** The lowes
1d880 74 20 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73  t cost plan wins
1d890 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61  .  The cost is a
1d8a0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1d8b0 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43  e amount of.** C
1d8c0 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20  PU and disk I/O 
1d8d0 6e 65 65 64 65 64 20 74 6f 20 70 72 6f 63 65 73  needed to proces
1d8e0 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
1d8f0 72 65 73 75 6c 74 2e 0a 2a 2a 20 46 61 63 74 6f  result..** Facto
1d900 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63  rs that influenc
1d910 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a  e cost include:.
1d920 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  **.**    *  The 
1d930 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
1d940 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
1d950 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65 64 2e  ll be retrieved.
1d960 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20    (The.**       
1d970 66 65 77 65 72 20 74 68 65 20 62 65 74 74 65 72  fewer the better
1d980 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57  .).**.**    *  W
1d990 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f  hether or not so
1d9a0 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72  rting must occur
1d9b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68  ..**.**    *  Wh
1d9c0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1d9d0 72 65 20 6d 75 73 74 20 62 65 20 73 65 70 61 72  re must be separ
1d9e0 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74  ate lookups in t
1d9f0 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65  he.**       inde
1da00 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69  x and in the mai
1da10 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  n table..**.** I
1da20 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
1da30 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1da40 20 28 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20   (pSrc->pIndex) 
1da50 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
1da60 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
1da70 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  SQL statement, t
1da80 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1da90 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73  n only considers
1daa0 20 70 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65   plans using the
1dab0 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78   .** named index
1dac0 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61  . If no such pla
1dad0 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  n is found, then
1dae0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
1daf0 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  st is.** SQLITE_
1db00 42 49 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c  BIG_DBL. If a pl
1db10 61 6e 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  an is found that
1db20 20 75 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20   uses the named 
1db30 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20  index, .** then 
1db40 74 68 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63  the cost is calc
1db50 75 6c 61 74 65 64 20 69 6e 20 74 68 65 20 75 73  ulated in the us
1db60 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  ual way..**.** I
1db70 66 20 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  f a NOT INDEXED 
1db80 63 6c 61 75 73 65 20 77 61 73 20 61 74 74 61 63  clause was attac
1db90 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  hed to the table
1dba0 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53 45 4c 45   .** in the SELE
1dbb0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1dbc0 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73 20 61 72  en no indexes ar
1dbd0 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 48 6f  e considered. Ho
1dbe0 77 65 76 65 72 2c 20 74 68 65 20 0a 2a 2a 20 73  wever, the .** s
1dbf0 65 6c 65 63 74 65 64 20 70 6c 61 6e 20 6d 61 79  elected plan may
1dc00 20 73 74 69 6c 6c 20 74 61 6b 65 20 61 64 76 61   still take adva
1dc10 6e 74 61 67 65 20 6f 66 20 74 68 65 20 62 75 69  ntage of the bui
1dc20 6c 74 2d 69 6e 20 72 6f 77 69 64 20 70 72 69 6d  lt-in rowid prim
1dc30 61 72 79 20 6b 65 79 0a 2a 2a 20 69 6e 64 65 78  ary key.** index
1dc40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1dc50 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
1dc60 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29  WhereBestIdx *p)
1dc70 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1dc80 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 20  e = p->pParse;  
1dc90 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1dca0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1dcb0 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70  eClause *pWC = p
1dcc0 2d 3e 70 57 43 3b 20 20 2f 2a 20 54 68 65 20 57  ->pWC;  /* The W
1dcd0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1dce0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1dcf0 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d 3e  item *pSrc = p->
1dd00 70 53 72 63 3b 20 2f 2a 20 54 68 65 20 46 52 4f  pSrc; /* The FRO
1dd10 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
1dd20 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74   search */.  int
1dd30 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43   iCur = pSrc->iC
1dd40 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  ursor;   /* The 
1dd50 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
1dd60 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73  ble to be access
1dd70 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
1dd80 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20  Probe;          
1dd90 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1dda0 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
1ddb0 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  g */.  Index *pI
1ddc0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1ddd0 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 50     /* Copy of pP
1dde0 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f 20 66 6f  robe, or zero fo
1ddf0 72 20 49 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20  r IPK index */. 
1de00 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b   int eqTermMask;
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20 6f 66 20  Current mask of 
1de30 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f  valid equality o
1de40 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
1de50 74 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b  t idxEqTermMask;
1de60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1de70 65 78 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64  ex mask of valid
1de80 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74   equality operat
1de90 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73  ors */.  Index s
1dea0 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pk;             
1deb0 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69       /* A fake i
1dec0 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
1ded0 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
1dee0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 69 52  */.  tRowcnt aiR
1def0 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20  owEstPk[2];     
1df00 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74   /* The aiRowEst
1df10 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
1df20 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
1df30 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d  int aiColumnPk =
1df40 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54   -1;        /* T
1df50 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c  he aColumn[] val
1df60 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
1df70 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 77 73  ndex */.  int ws
1df80 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20 20 20 20  FlagMask;       
1df90 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64        /* Allowed
1dfa0 20 66 6c 61 67 73 20 69 6e 20 70 2d 3e 63 6f 73   flags in p->cos
1dfb0 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 20 2a 2f  t.plan.wsFlag */
1dfc0 0a 20 20 69 6e 74 20 6e 50 72 69 6f 72 53 61 74  .  int nPriorSat
1dfd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1dfe0 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
1dff0 20 73 61 74 69 73 66 69 65 64 20 62 79 20 6f 75   satisfied by ou
1e000 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 69  ter loops */.  i
1e010 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
1e020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1e030 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
1e040 20 74 65 72 6d 73 20 2a 2f 0a 20 20 63 68 61 72   terms */.  char
1e050 20 62 53 6f 72 74 49 6e 69 74 3b 20 20 20 20 20   bSortInit;     
1e060 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
1e070 61 6c 69 7a 65 72 20 66 6f 72 20 62 53 6f 72 74  alizer for bSort
1e080 20 69 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a   in inner loop *
1e090 2f 0a 20 20 63 68 61 72 20 62 44 69 73 74 49 6e  /.  char bDistIn
1e0a0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
1e0b0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 72 20 66  /* Initializer f
1e0c0 6f 72 20 62 44 69 73 74 20 69 6e 20 69 6e 6e 65  or bDist in inne
1e0d0 72 20 6c 6f 6f 70 20 2a 2f 0a 0a 0a 20 20 2f 2a  r loop */...  /*
1e0e0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1e0f0 63 6f 73 74 20 74 6f 20 61 20 77 6f 72 73 74 2d  cost to a worst-
1e100 63 61 73 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  case value */.  
1e110 6d 65 6d 73 65 74 28 26 70 2d 3e 63 6f 73 74 2c  memset(&p->cost,
1e120 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f   0, sizeof(p->co
1e130 73 74 29 29 3b 0a 20 20 70 2d 3e 63 6f 73 74 2e  st));.  p->cost.
1e140 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  rCost = SQLITE_B
1e150 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49 66  IG_DBL;..  /* If
1e160 20 74 68 65 20 70 53 72 63 20 74 61 62 6c 65 20   the pSrc table 
1e170 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
1e180 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
1e190 4e 20 74 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f  N then we may no
1e1a0 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e  t.  ** use an in
1e1b0 64 65 78 20 74 6f 20 73 61 74 69 73 66 79 20 49  dex to satisfy I
1e1c0 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  S NULL constrain
1e1d0 74 73 20 6f 6e 20 74 68 61 74 20 74 61 62 6c 65  ts on that table
1e1e0 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20  .  This is.  ** 
1e1f0 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20  because columns 
1e200 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
1e210 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 74  ng NULL if the t
1e220 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  able does not ma
1e230 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72  tch -.  ** a cir
1e240 63 75 6d 73 74 61 6e 63 65 20 77 68 69 63 68 20  cumstance which 
1e250 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  the index cannot
1e260 20 68 65 6c 70 20 75 73 20 64 69 73 63 6f 76 65   help us discove
1e270 72 2e 20 20 54 69 63 6b 65 74 20 23 32 31 37 37  r.  Ticket #2177
1e280 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  ..  */.  if( pSr
1e290 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
1e2a0 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 69 64 78  _LEFT ){.    idx
1e2b0 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  EqTermMask = WO_
1e2c0 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73  EQ|WO_IN;.  }els
1e2d0 65 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d  e{.    idxEqTerm
1e2e0 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
1e2f0 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20  IN|WO_ISNULL;.  
1e300 7d 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  }..  if( pSrc->p
1e310 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20  Index ){.    /* 
1e320 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  An INDEXED BY cl
1e330 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61  ause specifies a
1e340 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
1e350 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  x to use */.    
1e360 70 49 64 78 20 3d 20 70 50 72 6f 62 65 20 3d 20  pIdx = pProbe = 
1e370 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pSrc->pIndex;.  
1e380 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e    wsFlagMask = ~
1e390 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c  (WHERE_ROWID_EQ|
1e3a0 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
1e3b0 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61  E);.    eqTermMa
1e3c0 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61  sk = idxEqTermMa
1e3d0 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sk;.  }else{.   
1e3e0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
1e3f0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1e400 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
1e410 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
1e420 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
1e430 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
1e440 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
1e450 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
1e460 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
1e470 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
1e480 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
1e490 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
1e4a0 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
1e4b0 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
1e4c0 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
1e4d0 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
1e4e0 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e500 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
1e510 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
1e520 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
1e530 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
1e540 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
1e550 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
1e560 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
1e570 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
1e580 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74      sPk.aiRowEst
1e590 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20   = aiRowEstPk;. 
1e5a0 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d     sPk.onError =
1e5b0 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
1e5c0 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53   sPk.pTable = pS
1e5d0 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69  rc->pTab;.    ai
1e5e0 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53  RowEstPk[0] = pS
1e5f0 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  rc->pTab->nRowEs
1e600 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
1e610 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46  k[1] = 1;.    pF
1e620 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
1e630 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
1e640 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
1e650 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
1e660 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
1e670 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
1e680 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
1e690 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
1e6a0 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
1e6b0 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
1e6c0 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
1e6d0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1e6e0 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
1e6f0 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
1e700 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
1e710 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
1e720 3d 20 7e 28 0a 20 20 20 20 20 20 20 20 57 48 45  = ~(.        WHE
1e730 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45  RE_COLUMN_IN|WHE
1e740 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
1e750 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57  RE_COLUMN_NULL|W
1e760 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1e770 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 65 71 54  E.    );.    eqT
1e780 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
1e790 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49 64 78 20  WO_IN;.    pIdx 
1e7a0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 72 64  = 0;.  }..  nOrd
1e7b0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1e7c0 42 79 20 3f 20 70 2d 3e 70 4f 72 64 65 72 42 79  By ? p->pOrderBy
1e7d0 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 69  ->nExpr : 0;.  i
1e7e0 66 28 20 70 2d 3e 69 20 29 7b 0a 20 20 20 20 6e  f( p->i ){.    n
1e7f0 50 72 69 6f 72 53 61 74 20 3d 20 70 2d 3e 61 4c  PriorSat = p->aL
1e800 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61  evel[p->i-1].pla
1e810 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 62 53  n.nOBSat;.    bS
1e820 6f 72 74 49 6e 69 74 20 3d 20 6e 50 72 69 6f 72  ortInit = nPrior
1e830 53 61 74 3c 6e 4f 72 64 65 72 42 79 3b 0a 20 20  Sat<nOrderBy;.  
1e840 20 20 62 44 69 73 74 49 6e 69 74 20 3d 20 30 3b    bDistInit = 0;
1e850 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
1e860 72 69 6f 72 53 61 74 20 3d 20 30 3b 0a 20 20 20  riorSat = 0;.   
1e870 20 62 53 6f 72 74 49 6e 69 74 20 3d 20 6e 4f 72   bSortInit = nOr
1e880 64 65 72 42 79 3e 30 3b 0a 20 20 20 20 62 44 69  derBy>0;.    bDi
1e890 73 74 49 6e 69 74 20 3d 20 70 2d 3e 70 44 69 73  stInit = p->pDis
1e8a0 74 69 6e 63 74 21 3d 30 3b 0a 20 20 7d 0a 0a 20  tinct!=0;.  }.. 
1e8b0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
1e8c0 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69 6e  l indices lookin
1e8d0 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 20 6f  g for the best o
1e8e0 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20  ne to use.  */. 
1e8f0 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70   for(; pProbe; p
1e900 49 64 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f 62  Idx=pProbe=pProb
1e910 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63  e->pNext){.    c
1e920 6f 6e 73 74 20 74 52 6f 77 63 6e 74 20 2a 20 63  onst tRowcnt * c
1e930 6f 6e 73 74 20 61 69 52 6f 77 45 73 74 20 3d 20  onst aiRowEst = 
1e940 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
1e950 3b 0a 20 20 20 20 57 68 65 72 65 43 6f 73 74 20  ;.    WhereCost 
1e960 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
1e970 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69    /* Cost of usi
1e980 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20  ng pProbe */.   
1e990 20 64 6f 75 62 6c 65 20 6c 6f 67 31 30 4e 20 3d   double log10N =
1e9a0 20 28 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20   (double)1;  /* 
1e9b0 62 61 73 65 2d 31 30 20 6c 6f 67 61 72 69 74 68  base-10 logarith
1e9c0 6d 20 6f 66 20 6e 52 6f 77 20 28 69 6e 65 78 61  m of nRow (inexa
1e9d0 63 74 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54  ct) */..    /* T
1e9e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1e9f0 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75 6c  iables are popul
1ea00 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
1ea10 65 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 0a  e properties of.
1ea20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 65 69      ** index bei
1ea30 6e 67 20 65 76 61 6c 75 61 74 65 64 2e 20 54 68  ng evaluated. Th
1ea40 65 79 20 61 72 65 20 74 68 65 6e 20 75 73 65 64  ey are then used
1ea50 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1ea60 65 20 65 78 70 65 63 74 65 64 0a 20 20 20 20 2a  e expected.    *
1ea70 2a 20 63 6f 73 74 20 61 6e 64 20 6e 75 6d 62 65  * cost and numbe
1ea80 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
1ea90 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1eaa0 2a 20 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3a 20  *  pc.plan.nEq: 
1eab0 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75 6d 62 65  .    **    Numbe
1eac0 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 74 65  r of equality te
1ead0 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  rms that can be 
1eae0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
1eaf0 67 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  g the index..   
1eb00 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68 65 72 20   **    In other 
1eb10 77 6f 72 64 73 2c 20 74 68 65 20 6e 75 6d 62 65  words, the numbe
1eb20 72 20 6f 66 20 69 6e 69 74 69 61 6c 20 66 69 65  r of initial fie
1eb30 6c 64 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  lds in the index
1eb40 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 20 20 20   that.    **    
1eb50 61 72 65 20 75 73 65 64 20 69 6e 20 3d 3d 20 6f  are used in == o
1eb60 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e 55 4c 4c  r IN or NOT NULL
1eb70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
1eb80 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1eb90 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1eba0 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20 20 20 2a   nInMul:  .    *
1ebb0 2a 20 20 20 20 54 68 65 20 22 69 6e 2d 6d 75 6c  *    The "in-mul
1ebc0 74 69 70 6c 69 65 72 22 2e 20 54 68 69 73 20 69  tiplier". This i
1ebd0 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1ebe0 20 68 6f 77 20 6d 61 6e 79 20 73 65 65 6b 20 6f   how many seek o
1ebf0 70 65 72 61 74 69 6f 6e 73 20 0a 20 20 20 20 2a  perations .    *
1ec00 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73 74  *    SQLite must
1ec10 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74 68 65 20   perform on the 
1ec20 69 6e 64 65 78 20 69 6e 20 71 75 65 73 74 69 6f  index in questio
1ec30 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n. For example, 
1ec40 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20  if the .    **  
1ec50 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69    WHERE clause i
1ec60 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1ec70 20 20 20 20 20 20 57 48 45 52 45 20 61 20 49 4e        WHERE a IN
1ec80 20 28 31 2c 20 32 2c 20 33 29 20 41 4e 44 20 62   (1, 2, 3) AND b
1ec90 20 49 4e 20 28 34 2c 20 35 2c 20 36 29 0a 20 20   IN (4, 5, 6).  
1eca0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
1ecb0 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f  QLite must perfo
1ecc0 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20 6f 6e 20  rm 9 lookups on 
1ecd0 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20  an index on (a, 
1ece0 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c 20 69 73  b), so nInMul is
1ecf0 20 0a 20 20 20 20 2a 2a 20 20 20 20 73 65 74 20   .    **    set 
1ed00 74 6f 20 39 2e 20 47 69 76 65 6e 20 74 68 65 20  to 9. Given the 
1ed10 73 61 6d 65 20 73 63 68 65 6d 61 20 61 6e 64 20  same schema and 
1ed20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
1ed30 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45 20 0a 20  llowing WHERE . 
1ed40 20 20 20 2a 2a 20 20 20 20 63 6c 61 75 73 65 73     **    clauses
1ed50 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1ed60 20 20 20 20 20 57 48 45 52 45 20 61 20 3d 20 20       WHERE a =  
1ed70 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48  1.    **      WH
1ed80 45 52 45 20 61 20 3e 3d 20 32 0a 20 20 20 20 2a  ERE a >= 2.    *
1ed90 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d  *.    **    nInM
1eda0 75 6c 20 69 73 20 73 65 74 20 74 6f 20 31 2e 0a  ul is set to 1..
1edb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1edc0 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73   If there exists
1edd0 20 61 20 57 48 45 52 45 20 74 65 72 6d 20 6f 66   a WHERE term of
1ede0 20 74 68 65 20 66 6f 72 6d 20 22 78 20 49 4e 20   the form "x IN 
1edf0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2c 20 74  (SELECT ...)", t
1ee00 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 74  hen .    **    t
1ee10 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69 73  he sub-select is
1ee20 20 61 73 73 75 6d 65 64 20 74 6f 20 72 65 74 75   assumed to retu
1ee30 72 6e 20 32 35 20 72 6f 77 73 20 66 6f 72 20 74  rn 25 rows for t
1ee40 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 0a  he purposes of .
1ee50 20 20 20 20 2a 2a 20 20 20 20 64 65 74 65 72 6d      **    determ
1ee60 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e 0a 20 20  ining nInMul..  
1ee70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 49 6e    **.    **  bIn
1ee80 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20  Est:  .    **   
1ee90 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
1eea0 74 68 65 72 65 20 77 61 73 20 61 74 20 6c 65 61  there was at lea
1eeb0 73 74 20 6f 6e 65 20 22 78 20 49 4e 20 28 53 45  st one "x IN (SE
1eec0 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65 72 6d 20  LECT ...)" term 
1eed0 75 73 65 64 20 0a 20 20 20 20 2a 2a 20 20 20 20  used .    **    
1eee0 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74  in determining t
1eef0 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 49 6e 4d  he value of nInM
1ef00 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  ul.  Note that t
1ef10 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 20 20  he RHS of the.  
1ef20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70 65 72 61    **    IN opera
1ef30 74 6f 72 20 6d 75 73 74 20 62 65 20 61 20 53 45  tor must be a SE
1ef40 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76 61 6c 75  LECT, not a valu
1ef50 65 20 6c 69 73 74 2c 20 66 6f 72 20 74 68 69 73  e list, for this
1ef60 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
1ef70 20 20 20 20 74 6f 20 62 65 20 74 72 75 65 2e 0a      to be true..
1ef80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 72      **.    **  r
1ef90 61 6e 67 65 44 69 76 3a 0a 20 20 20 20 2a 2a 20  angeDiv:.    ** 
1efa0 20 20 20 41 6e 20 65 73 74 69 6d 61 74 65 20 6f     An estimate o
1efb0 66 20 61 20 64 69 76 69 73 6f 72 20 62 79 20 77  f a divisor by w
1efc0 68 69 63 68 20 74 6f 20 72 65 64 75 63 65 20 74  hich to reduce t
1efd0 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
1efe0 64 75 65 0a 20 20 20 20 2a 2a 20 20 20 20 74 6f  due.    **    to
1eff0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1f000 74 72 61 69 6e 74 73 2e 20 20 49 6e 20 74 68 65  traints.  In the
1f010 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
1f020 74 65 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a 45  te_stat3 ANALYZE
1f030 0a 20 20 20 20 2a 2a 20 20 20 20 64 61 74 61 2c  .    **    data,
1f040 20 61 20 73 69 6e 67 6c 65 20 69 6e 65 71 75 61   a single inequa
1f050 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65  lity reduces the
1f060 20 73 65 61 72 63 68 20 73 70 61 63 65 20 74 6f   search space to
1f070 20 31 2f 34 72 64 20 69 74 73 0a 20 20 20 20 2a   1/4rd its.    *
1f080 2a 20 20 20 20 6f 72 69 67 69 6e 61 6c 20 73 69  *    original si
1f090 7a 65 20 28 72 61 6e 67 65 44 69 76 3d 3d 34 29  ze (rangeDiv==4)
1f0a0 2e 20 20 54 77 6f 20 69 6e 65 71 75 61 6c 69 74  .  Two inequalit
1f0b0 69 65 73 20 72 65 64 75 63 65 20 74 68 65 20 73  ies reduce the s
1f0c0 65 61 72 63 68 0a 20 20 20 20 2a 2a 20 20 20 20  earch.    **    
1f0d0 73 70 61 63 65 20 74 6f 20 31 2f 31 36 74 68 20  space to 1/16th 
1f0e0 6f 66 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  of its original 
1f0f0 73 69 7a 65 20 28 72 61 6e 67 65 44 69 76 3d 3d  size (rangeDiv==
1f100 31 36 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  16)..    **.    
1f110 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20 0a 20 20  **  bSort:   .  
1f120 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e    **    Boolean.
1f130 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69   True if there i
1f140 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
1f150 61 75 73 65 20 74 68 61 74 20 77 69 6c 6c 20 72  ause that will r
1f160 65 71 75 69 72 65 20 61 6e 20 0a 20 20 20 20 2a  equire an .    *
1f170 2a 20 20 20 20 65 78 74 65 72 6e 61 6c 20 73 6f  *    external so
1f180 72 74 20 28 69 2e 65 2e 20 73 63 61 6e 6e 69 6e  rt (i.e. scannin
1f190 67 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  g the index bein
1f1a0 67 20 65 76 61 6c 75 61 74 65 64 20 77 69 6c 6c  g evaluated will
1f1b0 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 20 20 20   not .    **    
1f1c0 63 6f 72 72 65 63 74 6c 79 20 6f 72 64 65 72 20  correctly order 
1f1d0 72 65 63 6f 72 64 73 29 2e 0a 20 20 20 20 2a 2a  records)..    **
1f1e0 0a 20 20 20 20 2a 2a 20 20 62 44 69 73 74 3a 0a  .    **  bDist:.
1f1f0 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61      **    Boolea
1f200 6e 2e 20 54 72 75 65 20 69 66 20 74 68 65 72 65  n. True if there
1f210 20 69 73 20 61 20 44 49 53 54 49 4e 43 54 20 63   is a DISTINCT c
1f220 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c 6c 20  lause that will 
1f230 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20 20 20  require an .    
1f240 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c 20 62  **    external b
1f250 74 72 65 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tree..    **.   
1f260 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20   **  bLookup: . 
1f270 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e     **    Boolean
1f280 2e 20 54 72 75 65 20 69 66 20 61 20 74 61 62 6c  . True if a tabl
1f290 65 20 6c 6f 6f 6b 75 70 20 69 73 20 72 65 71 75  e lookup is requ
1f2a0 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 69 6e  ired for each in
1f2b0 64 65 78 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a  dex entry.    **
1f2c0 20 20 20 20 76 69 73 69 74 65 64 2e 20 20 49 6e      visited.  In
1f2d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 72   other words, tr
1f2e0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ue if this is no
1f2f0 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  t a covering ind
1f300 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20 20 54 68  ex..    **    Th
1f310 69 73 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  is is always fal
1f320 73 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64  se for the rowid
1f330 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
1f340 65 78 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 20  ex of a table.. 
1f350 20 20 20 2a 2a 20 20 20 20 46 6f 72 20 6f 74 68     **    For oth
1f360 65 72 20 69 6e 64 65 78 65 73 2c 20 69 74 20 69  er indexes, it i
1f370 73 20 74 72 75 65 20 75 6e 6c 65 73 73 20 61 6c  s true unless al
1f380 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  l the columns of
1f390 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
1f3a0 2a 20 20 20 20 75 73 65 64 20 62 79 20 74 68 65  *    used by the
1f3b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1f3c0 74 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e  t are present in
1f3d0 20 74 68 65 20 69 6e 64 65 78 20 28 73 75 63 68   the index (such
1f3e0 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 69 6e   an.    **    in
1f3f0 64 65 78 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  dex is sometimes
1f400 20 64 65 73 63 72 69 62 65 64 20 61 73 20 61 20   described as a 
1f410 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 29 2e  covering index).
1f420 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20 65  .    **    For e
1f430 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20 74 68  xample, given th
1f440 65 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62  e index on (a, b
1f450 29 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 66  ), the second of
1f460 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
1f470 20 20 20 20 2a 2a 20 20 20 20 74 77 6f 20 71 75      **    two qu
1f480 65 72 69 65 73 20 72 65 71 75 69 72 65 73 20 74  eries requires t
1f490 61 62 6c 65 20 62 2d 74 72 65 65 20 6c 6f 6f 6b  able b-tree look
1f4a0 75 70 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ups in order to 
1f4b0 66 69 6e 64 20 74 68 65 20 76 61 6c 75 65 0a 20  find the value. 
1f4c0 20 20 20 2a 2a 20 20 20 20 6f 66 20 63 6f 6c 75     **    of colu
1f4d0 6d 6e 20 63 2c 20 62 75 74 20 74 68 65 20 66 69  mn c, but the fi
1f4e0 72 73 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 63  rst does not bec
1f4f0 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 61 20 61  ause columns a a
1f500 6e 64 20 62 20 61 72 65 0a 20 20 20 20 2a 2a 20  nd b are.    ** 
1f510 20 20 20 62 6f 74 68 20 61 76 61 69 6c 61 62 6c     both availabl
1f520 65 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  e in the index..
1f530 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f540 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54            SELECT
1f550 20 61 2c 20 62 20 20 20 20 46 52 4f 4d 20 74 62   a, b    FROM tb
1f560 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20  l WHERE a = 1;. 
1f570 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1f580 20 20 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63    SELECT a, b, c
1f590 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20   FROM tbl WHERE 
1f5a0 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2f 0a 20 20  a = 1;.    */.  
1f5b0 20 20 69 6e 74 20 62 49 6e 45 73 74 20 3d 20 30    int bInEst = 0
1f5c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f5d0 2f 2a 20 54 72 75 65 20 69 66 20 22 78 20 49 4e  /* True if "x IN
1f5e0 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22 20 73 65   (SELECT...)" se
1f5f0 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  en */.    int nI
1f600 6e 4d 75 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  nMul = 1;       
1f610 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f620 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 65 71  r of distinct eq
1f630 75 61 6c 69 74 69 65 73 20 74 6f 20 6c 6f 6f 6b  ualities to look
1f640 75 70 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  up */.    double
1f650 20 72 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75   rangeDiv = (dou
1f660 62 6c 65 29 31 3b 20 20 2f 2a 20 45 73 74 69 6d  ble)1;  /* Estim
1f670 61 74 65 64 20 72 65 64 75 63 74 69 6f 6e 20 69  ated reduction i
1f680 6e 20 73 65 61 72 63 68 20 73 70 61 63 65 20 2a  n search space *
1f690 2f 0a 20 20 20 20 69 6e 74 20 6e 42 6f 75 6e 64  /.    int nBound
1f6a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f6b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f6c0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1f6d0 74 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 63  ts seen */.    c
1f6e0 68 61 72 20 62 53 6f 72 74 20 3d 20 62 53 6f 72  har bSort = bSor
1f6f0 74 49 6e 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  tInit;       /* 
1f700 54 72 75 65 20 69 66 20 65 78 74 65 72 6e 61 6c  True if external
1f710 20 73 6f 72 74 20 72 65 71 75 69 72 65 64 20 2a   sort required *
1f720 2f 0a 20 20 20 20 63 68 61 72 20 62 44 69 73 74  /.    char bDist
1f730 20 3d 20 62 44 69 73 74 49 6e 69 74 3b 20 20 20   = bDistInit;   
1f740 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
1f750 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70  ndex cannot help
1f760 20 77 69 74 68 20 44 49 53 54 49 4e 43 54 20 2a   with DISTINCT *
1f770 2f 0a 20 20 20 20 63 68 61 72 20 62 4c 6f 6f 6b  /.    char bLook
1f780 75 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  up = 0;         
1f790 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
1f7a0 6f 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ot a covering in
1f7b0 64 65 78 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  dex */.    Where
1f7c0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
1f7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
1f7e0 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
1f7f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1f800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f810 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20  NABLE_STAT3.    
1f820 57 68 65 72 65 54 65 72 6d 20 2a 70 46 69 72 73  WhereTerm *pFirs
1f830 74 54 65 72 6d 20 3d 20 30 3b 20 20 20 20 2f 2a  tTerm = 0;    /*
1f840 20 46 69 72 73 74 20 74 65 72 6d 20 6d 61 74 63   First term matc
1f850 68 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 2a  hing the index *
1f860 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  /.#endif..    /*
1f870 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20 20  WHERETRACE((.   
1f880 20 20 20 22 20 20 20 25 73 28 25 73 29 3a 5c 6e     "   %s(%s):\n
1f890 22 2c 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 70  ",.      pSrc->p
1f8a0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49 64  Tab->zName, (pId
1f8b0 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  x ? pIdx->zName 
1f8c0 3a 20 22 69 70 6b 22 29 0a 20 20 20 20 29 29 3b  : "ipk").    ));
1f8d0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  */.    memset(&p
1f8e0 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 63 29  c, 0, sizeof(pc)
1f8f0 29 3b 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e  );.    pc.plan.n
1f900 4f 42 53 61 74 20 3d 20 6e 50 72 69 6f 72 53 61  OBSat = nPriorSa
1f910 74 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72  t;..    /* Deter
1f920 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20  mine the values 
1f930 6f 66 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 20 61  of pc.plan.nEq a
1f940 6e 64 20 6e 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20  nd nInMul */.   
1f950 20 66 6f 72 28 70 63 2e 70 6c 61 6e 2e 6e 45 71   for(pc.plan.nEq
1f960 3d 30 3b 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3c  =0; pc.plan.nEq<
1f970 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pProbe->nColumn;
1f980 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b 2b 29 7b   pc.plan.nEq++){
1f990 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
1f9a0 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
1f9b0 70 63 2e 70 6c 61 6e 2e 6e 45 71 5d 3b 0a 20 20  pc.plan.nEq];.  
1f9c0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
1f9d0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
1f9e0 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20  j, p->notReady, 
1f9f0 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78  eqTermMask, pIdx
1fa00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
1fa10 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rm==0 ) break;. 
1fa20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46       pc.plan.wsF
1fa30 6c 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43  lags |= (WHERE_C
1fa40 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52  OLUMN_EQ|WHERE_R
1fa50 4f 57 49 44 5f 45 51 29 3b 0a 20 20 20 20 20 20  OWID_EQ);.      
1fa60 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1fa70 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20  >pWC!=pWC );.   
1fa80 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
1fa90 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
1faa0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
1fab0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
1fac0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70  pExpr;.        p
1fad0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1fae0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  = WHERE_COLUMN_I
1faf0 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  N;.        if( E
1fb00 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1fb10 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1fb20 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ct) ){.         
1fb30 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43   /* "x IN (SELEC
1fb40 54 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d 65  T ...)":  Assume
1fb50 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
1fb60 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
1fb70 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20           nInMul 
1fb80 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 20  *= 25;.         
1fb90 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20 20   bInEst = 1;.   
1fba0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
1fbb0 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
1fbc0 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
1fbd0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
1fbe0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22  {.          /* "
1fbf0 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
1fc00 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20  ue, ...)" */.   
1fc10 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d         nInMul *=
1fc20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1fc30 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
1fc40 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
1fc50 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1fc60 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
1fc70 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61  {.        pc.pla
1fc80 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
1fc90 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
1fca0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
1fcb0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1fcc0 54 33 0a 20 20 20 20 20 20 69 66 28 20 70 63 2e  T3.      if( pc.
1fcd0 70 6c 61 6e 2e 6e 45 71 3d 3d 30 20 26 26 20 70  plan.nEq==0 && p
1fce0 50 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65 20 29  Probe->aSample )
1fcf0 20 70 46 69 72 73 74 54 65 72 6d 20 3d 20 70 54   pFirstTerm = pT
1fd00 65 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  erm;.#endif.    
1fd10 20 20 70 63 2e 75 73 65 64 20 7c 3d 20 70 54 65    pc.used |= pTe
1fd20 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
1fd30 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
1fd40 49 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  If the index bei
1fd50 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 69 73  ng considered is
1fd60 20 55 4e 49 51 55 45 2c 20 61 6e 64 20 74 68 65   UNIQUE, and the
1fd70 72 65 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74  re is an equalit
1fd80 79 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  y .    ** constr
1fd90 61 69 6e 74 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  aint for all col
1fda0 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
1fdb0 78 2c 20 74 68 65 6e 20 74 68 69 73 20 73 65 61  x, then this sea
1fdc0 72 63 68 20 77 69 6c 6c 20 66 69 6e 64 0a 20 20  rch will find.  
1fdd0 20 20 2a 2a 20 61 74 20 6d 6f 73 74 20 61 20 73    ** at most a s
1fde0 69 6e 67 6c 65 20 72 6f 77 2e 20 49 6e 20 74 68  ingle row. In th
1fdf0 69 73 20 63 61 73 65 20 73 65 74 20 74 68 65 20  is case set the 
1fe00 57 48 45 52 45 5f 55 4e 49 51 55 45 20 66 6c 61  WHERE_UNIQUE fla
1fe10 67 20 74 6f 20 0a 20 20 20 20 2a 2a 20 69 6e 64  g to .    ** ind
1fe20 69 63 61 74 65 20 74 68 69 73 20 74 6f 20 74 68  icate this to th
1fe30 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a  e caller..    **
1fe40 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
1fe50 65 2c 20 69 66 20 74 68 65 20 73 65 61 72 63 68  e, if the search
1fe60 20 6d 61 79 20 66 69 6e 64 20 6d 6f 72 65 20 74   may find more t
1fe70 68 61 6e 20 6f 6e 65 20 72 6f 77 2c 20 74 65 73  han one row, tes
1fe80 74 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  t to see if.    
1fe90 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 72 61  ** there is a ra
1fea0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  nge constraint o
1feb0 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1fec0 20 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b 31 29   (pc.plan.nEq+1)
1fed0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 6e   that.    ** can
1fee0 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73   be optimized us
1fef0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 20 0a  ing the index. .
1ff00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1ff10 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 70 50 72 6f  c.plan.nEq==pPro
1ff20 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70  be->nColumn && p
1ff30 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Probe->onError!=
1ff40 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20  OE_None ){.     
1ff50 20 74 65 73 74 63 61 73 65 28 20 70 63 2e 70 6c   testcase( pc.pl
1ff60 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1ff70 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a  RE_COLUMN_IN );.
1ff80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ff90 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
1ffa0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  & WHERE_COLUMN_N
1ffb0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ULL );.      if(
1ffc0 20 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67   (pc.plan.wsFlag
1ffd0 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
1ffe0 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_IN|WHERE_COLUM
1fff0 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20  N_NULL))==0 ){. 
20000 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77         pc.plan.w
20010 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
20020 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20  UNIQUE;.        
20030 69 66 28 20 70 2d 3e 69 3d 3d 30 20 7c 7c 20 28  if( p->i==0 || (
20040 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31  p->aLevel[p->i-1
20050 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ].plan.wsFlags &
20060 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55   WHERE_ALL_UNIQU
20070 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)!=0 ){.       
20080 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61     pc.plan.wsFla
20090 67 73 20 7c 3d 20 57 48 45 52 45 5f 41 4c 4c 5f  gs |= WHERE_ALL_
200a0 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20  UNIQUE;.        
200b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
200c0 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  lse if( pProbe->
200d0 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b  bUnordered==0 ){
200e0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
200f0 20 20 20 20 6a 20 3d 20 28 70 63 2e 70 6c 61 6e      j = (pc.plan
20100 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43  .nEq==pProbe->nC
20110 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 50 72  olumn ? -1 : pPr
20120 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 63  obe->aiColumn[pc
20130 2e 70 6c 61 6e 2e 6e 45 71 5d 29 3b 0a 20 20 20  .plan.nEq]);.   
20140 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
20150 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d  pWC, iCur, j, p-
20160 3e 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54  >notReady, WO_LT
20170 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
20180 47 45 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20  GE, pIdx) ){.   
20190 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
201a0 70 54 6f 70 2c 20 2a 70 42 74 6d 3b 0a 20 20 20  pTop, *pBtm;.   
201b0 20 20 20 20 20 70 54 6f 70 20 3d 20 66 69 6e 64       pTop = find
201c0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
201d0 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20  j, p->notReady, 
201e0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64  WO_LT|WO_LE, pId
201f0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 6d  x);.        pBtm
20200 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
20210 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74   iCur, j, p->not
20220 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
20230 47 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  GE, pIdx);.     
20240 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
20250 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72  nEst(pParse, pPr
20260 6f 62 65 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45 71  obe, pc.plan.nEq
20270 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72  , pBtm, pTop, &r
20280 61 6e 67 65 44 69 76 29 3b 0a 20 20 20 20 20 20  angeDiv);.      
20290 20 20 69 66 28 20 70 54 6f 70 20 29 7b 0a 20 20    if( pTop ){.  
202a0 20 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d          nBound =
202b0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63   1;.          pc
202c0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
202d0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
202e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 75  ;.          pc.u
202f0 73 65 64 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65  sed |= pTop->pre
20300 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
20310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
20320 6f 70 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a  op->pWC!=pWC );.
20330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20340 20 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20 20    if( pBtm ){.  
20350 20 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b          nBound++
20360 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70  ;.          pc.p
20370 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
20380 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
20390 20 20 20 20 20 20 20 20 20 20 70 63 2e 75 73 65            pc.use
203a0 64 20 7c 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65  d |= pBtm->prere
203b0 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
203c0 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 6d    testcase( pBtm
203d0 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20  ->pWC!=pWC );.  
203e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
203f0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
20400 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  |= (WHERE_COLUMN
20410 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57  _RANGE|WHERE_ROW
20420 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 20  ID_RANGE);.     
20430 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
20440 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
20450 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20460 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 62 65  and the index be
20470 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 77  ing considered w
20480 69 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72  ill.    ** natur
20490 61 6c 6c 79 20 73 63 61 6e 20 72 6f 77 73 20 69  ally scan rows i
204a0 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6f  n the required o
204b0 72 64 65 72 2c 20 73 65 74 20 74 68 65 20 61 70  rder, set the ap
204c0 70 72 6f 70 72 69 61 74 65 20 66 6c 61 67 73 0a  propriate flags.
204d0 20 20 20 20 2a 2a 20 69 6e 20 70 63 2e 70 6c 61      ** in pc.pla
204e0 6e 2e 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72  n.wsFlags. Other
204f0 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 69  wise, if there i
20500 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
20510 61 75 73 65 20 62 75 74 0a 20 20 20 20 2a 2a 20  ause but.    ** 
20520 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 73  the index will s
20530 63 61 6e 20 72 6f 77 73 20 69 6e 20 61 20 64 69  can rows in a di
20540 66 66 65 72 65 6e 74 20 6f 72 64 65 72 2c 20 73  fferent order, s
20550 65 74 20 74 68 65 20 62 53 6f 72 74 0a 20 20 20  et the bSort.   
20560 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a   ** variable.  *
20570 2f 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20  /.    if( bSort 
20580 26 26 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  && (pSrc->jointy
20590 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30  pe & JT_LEFT)==0
205a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 52   ){.      int bR
205b0 65 76 20 3d 20 32 3b 0a 20 20 20 20 20 20 69 6e  ev = 2;.      in
205c0 74 20 62 4f 62 55 6e 69 71 75 65 20 3d 20 30 3b  t bObUnique = 0;
205d0 0a 20 20 20 20 20 20 2f 2a 57 48 45 52 45 54 52  .      /*WHERETR
205e0 41 43 45 28 28 22 20 20 20 20 20 20 2d 2d 3e 20  ACE(("      --> 
205f0 62 65 66 6f 72 65 20 69 73 53 6f 72 74 49 6e 64  before isSortInd
20600 65 78 3a 20 6e 50 72 69 6f 72 53 61 74 3d 25 64  ex: nPriorSat=%d
20610 5c 6e 22 2c 6e 50 72 69 6f 72 53 61 74 29 29 3b  \n",nPriorSat));
20620 2a 2f 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  */.      pc.plan
20630 2e 6e 4f 42 53 61 74 20 3d 20 69 73 53 6f 72 74  .nOBSat = isSort
20640 69 6e 67 49 6e 64 65 78 28 70 2c 20 70 50 72 6f  ingIndex(p, pPro
20650 62 65 2c 20 69 43 75 72 2c 20 26 62 52 65 76 2c  be, iCur, &bRev,
20660 20 26 62 4f 62 55 6e 69 71 75 65 29 3b 0a 20 20   &bObUnique);.  
20670 20 20 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45      /*WHERETRACE
20680 28 28 22 20 20 20 20 20 20 2d 2d 3e 20 61 66 74  (("      --> aft
20690 65 72 20 20 69 73 53 6f 72 74 49 6e 64 65 78 3a  er  isSortIndex:
206a0 20 62 52 65 76 3d 25 64 20 62 4f 62 55 3d 25 64   bRev=%d bObU=%d
206b0 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c 0a 20   nOBSat=%d\n",. 
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 62 52 65 76 2c 20 62 4f 62 55 6e 69 71 75 65   bRev, bObUnique
206e0 2c 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  , pc.plan.nOBSat
206f0 29 29 3b 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ));*/.      if( 
20700 6e 50 72 69 6f 72 53 61 74 3c 70 63 2e 70 6c 61  nPriorSat<pc.pla
20710 6e 2e 6e 4f 42 53 61 74 20 7c 7c 20 28 70 63 2e  n.nOBSat || (pc.
20720 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
20730 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29  HERE_ALL_UNIQUE)
20740 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
20750 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
20760 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 3b  = WHERE_ORDERED;
20770 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 4f 62  .        if( bOb
20780 55 6e 69 71 75 65 20 29 20 70 63 2e 70 6c 61 6e  Unique ) pc.plan
20790 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
207a0 45 5f 4f 42 5f 55 4e 49 51 55 45 3b 0a 20 20 20  E_OB_UNIQUE;.   
207b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
207c0 4f 72 64 65 72 42 79 3d 3d 70 63 2e 70 6c 61 6e  OrderBy==pc.plan
207d0 2e 6e 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20  .nOBSat ){.     
207e0 20 20 20 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20     bSort = 0;.  
207f0 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
20800 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  Flags |= WHERE_R
20810 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48 45 52 45  OWID_RANGE|WHERE
20820 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20  _COLUMN_RANGE;. 
20830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20840 20 62 52 65 76 20 26 20 31 20 29 20 70 63 2e 70   bRev & 1 ) pc.p
20850 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
20860 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
20870 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
20880 68 65 72 65 20 69 73 20 61 20 44 49 53 54 49 4e  here is a DISTIN
20890 43 54 20 71 75 61 6c 69 66 69 65 72 20 61 6e 64  CT qualifier and
208a0 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c   this index will
208b0 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 0a 20 20   scan rows in.  
208c0 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68    ** order of th
208d0 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65  e DISTINCT expre
208e0 73 73 69 6f 6e 73 2c 20 63 6c 65 61 72 20 62 44  ssions, clear bD
208f0 69 73 74 20 61 6e 64 20 73 65 74 20 74 68 65 20  ist and set the 
20900 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20 20 20  appropriate.    
20910 2a 2a 20 66 6c 61 67 73 20 69 6e 20 70 63 2e 70  ** flags in pc.p
20920 6c 61 6e 2e 77 73 46 6c 61 67 73 2e 20 2a 2f 0a  lan.wsFlags. */.
20930 20 20 20 20 69 66 28 20 62 44 69 73 74 0a 20 20      if( bDist.  
20940 20 20 20 26 26 20 69 73 44 69 73 74 69 6e 63 74     && isDistinct
20950 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
20960 43 2c 20 70 50 72 6f 62 65 2c 20 69 43 75 72 2c  C, pProbe, iCur,
20970 20 70 2d 3e 70 44 69 73 74 69 6e 63 74 2c 20 70   p->pDistinct, p
20980 63 2e 70 6c 61 6e 2e 6e 45 71 29 0a 20 20 20 20  c.plan.nEq).    
20990 20 26 26 20 28 70 63 2e 70 6c 61 6e 2e 77 73 46   && (pc.plan.wsF
209a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
209b0 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 29  UMN_IN)==0.    )
209c0 7b 0a 20 20 20 20 20 20 62 44 69 73 74 20 3d 20  {.      bDist = 
209d0 30 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  0;.      pc.plan
209e0 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
209f0 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48  E_ROWID_RANGE|WH
20a00 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
20a10 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 3b  |WHERE_DISTINCT;
20a20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
20a30 66 20 63 75 72 72 65 6e 74 6c 79 20 63 61 6c 63  f currently calc
20a40 75 6c 61 74 69 6e 67 20 74 68 65 20 63 6f 73 74  ulating the cost
20a50 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
20a60 65 78 20 28 6e 6f 74 20 74 68 65 20 49 50 4b 0a  ex (not the IPK.
20a70 20 20 20 20 2a 2a 20 69 6e 64 65 78 29 2c 20 64      ** index), d
20a80 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6c 6c 20  etermine if all 
20a90 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
20aa0 64 61 74 61 20 6d 61 79 20 62 65 20 6f 62 74 61  data may be obta
20ab0 69 6e 65 64 20 77 69 74 68 6f 75 74 20 0a 20 20  ined without .  
20ac0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d    ** using the m
20ad0 61 69 6e 20 74 61 62 6c 65 20 28 69 2e 65 2e 20  ain table (i.e. 
20ae0 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  if the index is 
20af0 61 20 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a  a covering.    *
20b00 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73  * index for this
20b10 20 71 75 65 72 79 29 2e 20 49 66 20 69 74 20 69   query). If it i
20b20 73 2c 20 73 65 74 20 74 68 65 20 57 48 45 52 45  s, set the WHERE
20b30 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  _IDX_ONLY flag i
20b40 6e 0a 20 20 20 20 2a 2a 20 70 63 2e 70 6c 61 6e  n.    ** pc.plan
20b50 2e 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77  .wsFlags. Otherw
20b60 69 73 65 2c 20 73 65 74 20 74 68 65 20 62 4c 6f  ise, set the bLo
20b70 6f 6b 75 70 20 76 61 72 69 61 62 6c 65 20 74 6f  okup variable to
20b80 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69   true.  */.    i
20b90 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
20ba0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72   Bitmask m = pSr
20bb0 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  c->colUsed;.    
20bc0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
20bd0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
20be0 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
20bf0 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70         int x = p
20c00 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
20c10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
20c20 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  BMS-1 ){.       
20c30 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d     m &= ~(((Bitm
20c40 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20  ask)1)<<x);.    
20c50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20c60 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a      if( m==0 ){.
20c70 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
20c80 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
20c90 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
20ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20cb0 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a 20 20 20  bLookup = 1;.   
20cc0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20cd0 2f 2a 0a 20 20 20 20 2a 2a 20 45 73 74 69 6d 61  /*.    ** Estima
20ce0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
20cf0 20 72 6f 77 73 20 6f 66 20 6f 75 74 70 75 74 2e   rows of output.
20d00 20 20 46 6f 72 20 61 6e 20 22 78 20 49 4e 20 28    For an "x IN (
20d10 53 45 4c 45 43 54 2e 2e 2e 29 22 0a 20 20 20 20  SELECT...)".    
20d20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 64  ** constraint, d
20d30 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73  o not let the es
20d40 74 69 6d 61 74 65 20 65 78 63 65 65 64 20 68 61  timate exceed ha
20d50 6c 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  lf the rows in t
20d60 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
20d70 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f  .    pc.plan.nRo
20d80 77 20 3d 20 28 64 6f 75 62 6c 65 29 28 61 69 52  w = (double)(aiR
20d90 6f 77 45 73 74 5b 70 63 2e 70 6c 61 6e 2e 6e 45  owEst[pc.plan.nE
20da0 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20  q] * nInMul);.  
20db0 20 20 69 66 28 20 62 49 6e 45 73 74 20 26 26 20    if( bInEst && 
20dc0 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a 32 3e 61  pc.plan.nRow*2>a
20dd0 69 52 6f 77 45 73 74 5b 30 5d 20 29 7b 0a 20 20  iRowEst[0] ){.  
20de0 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77      pc.plan.nRow
20df0 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2f 32   = aiRowEst[0]/2
20e00 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 3d  ;.      nInMul =
20e10 20 28 69 6e 74 29 28 70 63 2e 70 6c 61 6e 2e 6e   (int)(pc.plan.n
20e20 52 6f 77 20 2f 20 61 69 52 6f 77 45 73 74 5b 70  Row / aiRowEst[p
20e30 63 2e 70 6c 61 6e 2e 6e 45 71 5d 29 3b 0a 20 20  c.plan.nEq]);.  
20e40 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
20e50 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
20e60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
20e70 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74  nstraint is of t
20e80 68 65 20 66 6f 72 6d 20 78 3d 56 41 4c 55 45 20  he form x=VALUE 
20e90 6f 72 20 78 20 49 4e 20 28 45 31 2c 45 32 2c 2e  or x IN (E1,E2,.
20ea0 2e 2e 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 77  ..).    ** and w
20eb0 65 20 64 6f 20 6e 6f 74 20 74 68 69 6e 6b 20 74  e do not think t
20ec0 68 61 74 20 76 61 6c 75 65 73 20 6f 66 20 78 20  hat values of x 
20ed0 61 72 65 20 75 6e 69 71 75 65 20 61 6e 64 20 69  are unique and i
20ee0 66 20 68 69 73 74 6f 67 72 61 6d 0a 20 20 20 20  f histogram.    
20ef0 2a 2a 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  ** data is avail
20f00 61 62 6c 65 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  able for column 
20f10 78 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  x, then it might
20f20 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
20f30 20 2a 2a 20 74 6f 20 67 65 74 20 61 20 62 65 74   ** to get a bet
20f40 74 65 72 20 65 73 74 69 6d 61 74 65 20 6f 6e 20  ter estimate on 
20f50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
20f60 77 73 20 62 61 73 65 64 20 6f 6e 0a 20 20 20 20  ws based on.    
20f70 2a 2a 20 56 41 4c 55 45 20 61 6e 64 20 68 6f 77  ** VALUE and how
20f80 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 76 61 6c   common that val
20f90 75 65 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20  ue is according 
20fa0 74 6f 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d  to the histogram
20fb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20fc0 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 28 64   pc.plan.nRow>(d
20fd0 6f 75 62 6c 65 29 31 20 26 26 20 70 63 2e 70 6c  ouble)1 && pc.pl
20fe0 61 6e 2e 6e 45 71 3d 3d 31 0a 20 20 20 20 20 26  an.nEq==1.     &
20ff0 26 20 70 46 69 72 73 74 54 65 72 6d 21 3d 30 20  & pFirstTerm!=0 
21000 26 26 20 61 69 52 6f 77 45 73 74 5b 31 5d 3e 31  && aiRowEst[1]>1
21010 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
21020 28 20 28 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  ( (pFirstTerm->e
21030 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
21040 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  Q|WO_ISNULL|WO_I
21050 4e 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  N))!=0 );.      
21060 69 66 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  if( pFirstTerm->
21070 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
21080 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b  EQ|WO_ISNULL) ){
21090 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
210a0 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  e( pFirstTerm->e
210b0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
210c0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
210d0 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d  case( pFirstTerm
210e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
210f0 5f 45 51 55 49 56 20 29 3b 0a 20 20 20 20 20 20  _EQUIV );.      
21100 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69 72    testcase( pFir
21110 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
21120 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
21130 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 45 71  .        whereEq
21140 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
21150 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73  e, pProbe, pFirs
21160 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  tTerm->pExpr->pR
21170 69 67 68 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ight,.          
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21190 26 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 3b 0a  &pc.plan.nRow);.
211a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
211b0 62 49 6e 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  bInEst==0 ){.   
211c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69       assert( pFi
211d0 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
211e0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
211f0 20 20 20 20 20 20 77 68 65 72 65 49 6e 53 63 61        whereInSca
21200 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72  nEst(pParse, pPr
21210 6f 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d  obe, pFirstTerm-
21220 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c  >pExpr->x.pList,
21230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21240 20 20 20 20 20 20 20 20 26 70 63 2e 70 6c 61 6e          &pc.plan
21250 2e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a  .nRow);.      }.
21260 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
21270 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
21280 41 54 33 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41  AT3 */..    /* A
21290 64 6a 75 73 74 20 74 68 65 20 6e 75 6d 62 65 72  djust the number
212a0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
212b0 61 6e 64 20 64 6f 77 6e 77 61 72 64 20 74 6f 20  and downward to 
212c0 72 65 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20  reflect rows.   
212d0 20 2a 2a 20 74 68 61 74 20 61 72 65 20 65 78 63   ** that are exc
212e0 6c 75 64 65 64 20 62 79 20 72 61 6e 67 65 20 63  luded by range c
212f0 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
21300 2a 2f 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e  */.    pc.plan.n
21310 52 6f 77 20 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52  Row = pc.plan.nR
21320 6f 77 2f 72 61 6e 67 65 44 69 76 3b 0a 20 20 20  ow/rangeDiv;.   
21330 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f   if( pc.plan.nRo
21340 77 3c 31 20 29 20 70 63 2e 70 6c 61 6e 2e 6e 52  w<1 ) pc.plan.nR
21350 6f 77 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ow = 1;..    /* 
21360 45 78 70 65 72 69 6d 65 6e 74 73 20 72 75 6e 20  Experiments run 
21370 6f 6e 20 72 65 61 6c 20 53 51 4c 69 74 65 20 64  on real SQLite d
21380 61 74 61 62 61 73 65 73 20 73 68 6f 77 20 74 68  atabases show th
21390 61 74 20 74 68 65 20 74 69 6d 65 20 6e 65 65 64  at the time need
213a0 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 20  ed.    ** to do 
213b0 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
213c0 74 6f 20 6c 6f 63 61 74 65 20 61 20 72 6f 77 20  to locate a row 
213d0 69 6e 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  in a table or in
213e0 64 65 78 20 69 73 20 72 6f 75 67 68 6c 79 0a 20  dex is roughly. 
213f0 20 20 20 2a 2a 20 6c 6f 67 31 30 28 4e 29 20 74     ** log10(N) t
21400 69 6d 65 73 20 74 68 65 20 74 69 6d 65 20 74 6f  imes the time to
21410 20 6d 6f 76 65 20 66 72 6f 6d 20 6f 6e 65 20 72   move from one r
21420 6f 77 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  ow to the next r
21430 6f 77 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  ow within.    **
21440 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
21450 78 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 74  x.  The actual t
21460 69 6d 65 73 20 63 61 6e 20 76 61 72 79 2c 20 77  imes can vary, w
21470 69 74 68 20 74 68 65 20 73 69 7a 65 20 6f 66 0a  ith the size of.
21480 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 62      ** records b
21490 65 69 6e 67 20 61 6e 20 69 6d 70 6f 72 74 61 6e  eing an importan
214a0 74 20 66 61 63 74 6f 72 2e 20 20 42 6f 74 68 20  t factor.  Both 
214b0 6d 6f 76 65 73 20 61 6e 64 20 73 65 61 72 63 68  moves and search
214c0 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 6c  es are.    ** sl
214d0 6f 77 65 72 20 77 69 74 68 20 6c 61 72 67 65 72  ower with larger
214e0 20 72 65 63 6f 72 64 73 2c 20 70 72 65 73 75 6d   records, presum
214f0 61 62 6c 79 20 62 65 63 61 75 73 65 20 66 65 77  ably because few
21500 65 72 20 72 65 63 6f 72 64 73 20 66 69 74 0a 20  er records fit. 
21510 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67     ** on one pag
21520 65 20 61 6e 64 20 68 65 6e 63 65 20 6d 6f 72 65  e and hence more
21530 20 70 61 67 65 73 20 68 61 76 65 20 74 6f 20 62   pages have to b
21540 65 20 66 65 74 63 68 65 64 2e 0a 20 20 20 20 2a  e fetched..    *
21550 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 41 4e 41  *.    ** The ANA
21560 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 20 61 6e 64  LYZE command and
21570 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
21580 31 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  1 and sqlite_sta
21590 74 33 20 74 61 62 6c 65 73 20 64 6f 0a 20 20 20  t3 tables do.   
215a0 20 2a 2a 20 6e 6f 74 20 67 69 76 65 20 75 73 20   ** not give us 
215b0 64 61 74 61 20 6f 6e 20 74 68 65 20 72 65 6c 61  data on the rela
215c0 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 61  tive sizes of ta
215d0 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ble and index re
215e0 63 6f 72 64 73 2e 0a 20 20 20 20 2a 2a 20 53 6f  cords..    ** So
215f0 20 74 68 69 73 20 63 6f 6d 70 75 74 61 74 69 6f   this computatio
21600 6e 20 61 73 73 75 6d 65 73 20 74 61 62 6c 65 20  n assumes table 
21610 72 65 63 6f 72 64 73 20 61 72 65 20 61 62 6f 75  records are abou
21620 74 20 74 77 69 63 65 20 61 73 20 62 69 67 0a 20  t twice as big. 
21630 20 20 20 2a 2a 20 61 73 20 69 6e 64 65 78 20 72     ** as index r
21640 65 63 6f 72 64 73 0a 20 20 20 20 2a 2f 0a 20 20  ecords.    */.  
21650 20 20 69 66 28 20 28 70 63 2e 70 6c 61 6e 2e 77    if( (pc.plan.w
21660 73 46 6c 61 67 73 26 7e 28 57 48 45 52 45 5f 52  sFlags&~(WHERE_R
21670 45 56 45 52 53 45 7c 57 48 45 52 45 5f 4f 52 44  EVERSE|WHERE_ORD
21680 45 52 45 44 7c 57 48 45 52 45 5f 4f 42 5f 55 4e  ERED|WHERE_OB_UN
21690 49 51 55 45 29 29 0a 20 20 20 20 20 20 20 20 20  IQUE)).         
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216d0 20 20 20 20 20 3d 3d 57 48 45 52 45 5f 49 44 58       ==WHERE_IDX
216e0 5f 4f 4e 4c 59 0a 20 20 20 20 20 26 26 20 28 70  _ONLY.     && (p
216f0 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  WC->wctrlFlags &
21700 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
21710 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20  ESIRED)==0.     
21720 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
21730 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
21740 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
21750 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
21760 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
21770 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20  verIdxScan).    
21780 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
21790 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 73   index is not us
217a0 65 66 75 6c 20 66 6f 72 20 69 6e 64 65 78 69 6e  eful for indexin
217b0 67 2c 20 62 75 74 20 69 74 20 69 73 20 61 20 63  g, but it is a c
217c0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20  overing index.. 
217d0 20 20 20 20 20 2a 2a 20 41 20 66 75 6c 6c 2d 73       ** A full-s
217e0 63 61 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  can of the index
217f0 20 6d 69 67 68 74 20 62 65 20 61 20 6c 69 74 74   might be a litt
21800 6c 65 20 66 61 73 74 65 72 20 74 68 61 6e 20 61  le faster than a
21810 20 66 75 6c 6c 2d 73 63 61 6e 0a 20 20 20 20 20   full-scan.     
21820 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
21830 2c 20 73 6f 20 67 69 76 65 20 74 68 69 73 20 63  , so give this c
21840 61 73 65 20 61 20 63 6f 73 74 20 73 6c 69 67 68  ase a cost sligh
21850 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 61 20  tly less than a 
21860 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73  table.      ** s
21870 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 70 63  can. */.      pc
21880 2e 72 43 6f 73 74 20 3d 20 61 69 52 6f 77 45 73  .rCost = aiRowEs
21890 74 5b 30 5d 2a 33 20 2b 20 70 50 72 6f 62 65 2d  t[0]*3 + pProbe-
218a0 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
218b0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
218c0 7c 3d 20 57 48 45 52 45 5f 43 4f 56 45 52 5f 53  |= WHERE_COVER_S
218d0 43 41 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  CAN|WHERE_COLUMN
218e0 5f 52 41 4e 47 45 3b 0a 20 20 20 20 7d 65 6c 73  _RANGE;.    }els
218f0 65 20 69 66 28 20 28 70 63 2e 70 6c 61 6e 2e 77  e if( (pc.plan.w
21900 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
21910 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20  OT_FULLSCAN)==0 
21920 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
21930 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 74  cost of a full t
21940 61 62 6c 65 20 73 63 61 6e 20 69 73 20 61 20 6e  able scan is a n
21950 75 6d 62 65 72 20 6f 66 20 6d 6f 76 65 20 6f 70  umber of move op
21960 65 72 61 74 69 6f 6e 73 20 65 71 75 61 6c 0a 20  erations equal. 
21970 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e       ** to the n
21980 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
21990 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
219a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65    **.      ** We
219b0 20 61 64 64 20 61 6e 20 61 64 64 69 74 69 6f 6e   add an addition
219c0 61 6c 20 34 78 20 70 65 6e 61 6c 74 79 20 74 6f  al 4x penalty to
219d0 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
219e0 73 2e 20 20 54 68 69 73 20 63 61 75 73 65 73 0a  s.  This causes.
219f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 73        ** the cos
21a00 74 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 65 72  t function to er
21a10 72 20 6f 6e 20 74 68 65 20 73 69 64 65 20 6f 66  r on the side of
21a20 20 63 68 6f 6f 73 69 6e 67 20 61 6e 20 69 6e 64   choosing an ind
21a30 65 78 20 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a  ex over.      **
21a40 20 63 68 6f 6f 73 69 6e 67 20 61 20 66 75 6c 6c   choosing a full
21a50 20 73 63 61 6e 2e 20 20 54 68 69 73 20 34 78 20   scan.  This 4x 
21a60 66 75 6c 6c 2d 73 63 61 6e 20 70 65 6e 61 6c 74  full-scan penalt
21a70 79 20 69 73 20 61 6e 20 61 72 67 75 61 62 6c 65  y is an arguable
21a80 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 69 73 69  .      ** decisi
21a90 6f 6e 20 61 6e 64 20 6f 6e 65 20 77 68 69 63 68  on and one which
21aa0 20 77 65 20 65 78 70 65 63 74 20 74 6f 20 72 65   we expect to re
21ab0 76 69 73 69 74 20 69 6e 20 74 68 65 20 66 75 74  visit in the fut
21ac0 75 72 65 2e 20 20 42 75 74 0a 20 20 20 20 20 20  ure.  But.      
21ad0 2a 2a 20 69 74 20 73 65 65 6d 73 20 74 6f 20 62  ** it seems to b
21ae0 65 20 77 6f 72 6b 69 6e 67 20 77 65 6c 6c 20 65  e working well e
21af0 6e 6f 75 67 68 20 61 74 20 74 68 65 20 6d 6f 6d  nough at the mom
21b00 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
21b10 20 20 20 20 70 63 2e 72 43 6f 73 74 20 3d 20 61      pc.rCost = a
21b20 69 52 6f 77 45 73 74 5b 30 5d 2a 34 3b 0a 20 20  iRowEst[0]*4;.  
21b30 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
21b40 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44  ags &= ~WHERE_ID
21b50 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 66  X_ONLY;.      if
21b60 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
21b70 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
21b80 73 20 26 3d 20 7e 57 48 45 52 45 5f 4f 52 44 45  s &= ~WHERE_ORDE
21b90 52 45 44 3b 0a 20 20 20 20 20 20 20 20 70 63 2e  RED;.        pc.
21ba0 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 6e 50  plan.nOBSat = nP
21bb0 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 20 20 7d  riorSat;.      }
21bc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21bd0 20 20 6c 6f 67 31 30 4e 20 3d 20 65 73 74 4c 6f    log10N = estLo
21be0 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a  g(aiRowEst[0]);.
21bf0 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20 3d        pc.rCost =
21c00 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20   pc.plan.nRow;. 
21c10 20 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b       if( pIdx ){
21c20 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 4c 6f  .        if( bLo
21c30 6f 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20  okup ){.        
21c40 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65    /* For an inde
21c50 78 20 6c 6f 6f 6b 75 70 20 66 6f 6c 6c 6f 77 65  x lookup followe
21c60 64 20 62 79 20 61 20 74 61 62 6c 65 20 6c 6f 6f  d by a table loo
21c70 6b 75 70 3a 0a 20 20 20 20 20 20 20 20 20 20 2a  kup:.          *
21c80 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65  *    nInMul inde
21c90 78 20 73 65 61 72 63 68 65 73 20 74 6f 20 66 69  x searches to fi
21ca0 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  nd the start of 
21cb0 65 61 63 68 20 69 6e 64 65 78 20 72 61 6e 67 65  each index range
21cc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b  .          **  +
21cd0 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f   nRow steps thro
21ce0 75 67 68 20 74 68 65 20 69 6e 64 65 78 0a 20 20  ugh the index.  
21cf0 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52          **  + nR
21d00 6f 77 20 74 61 62 6c 65 20 73 65 61 72 63 68 65  ow table searche
21d10 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  s to lookup the 
21d20 74 61 62 6c 65 20 65 6e 74 72 79 20 75 73 69 6e  table entry usin
21d30 67 20 74 68 65 20 72 6f 77 69 64 0a 20 20 20 20  g the rowid.    
21d40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21d50 20 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 28     pc.rCost += (
21d60 6e 49 6e 4d 75 6c 20 2b 20 70 63 2e 70 6c 61 6e  nInMul + pc.plan
21d70 2e 6e 52 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a 20  .nRow)*log10N;. 
21d80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21d90 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61          /* For a
21da0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 3a   covering index:
21db0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
21dc0 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73    nInMul index s
21dd0 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20  earches to find 
21de0 74 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74 72  the initial entr
21df0 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  y .          ** 
21e00 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20 74    + nRow steps t
21e10 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65 78  hrough the index
21e20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
21e30 20 20 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74          pc.rCost
21e40 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30   += nInMul*log10
21e50 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
21e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21e70 20 20 2f 2a 20 46 6f 72 20 61 20 72 6f 77 69 64    /* For a rowid
21e80 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6c 6f 6f   primary key loo
21e90 6b 75 70 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  kup:.        ** 
21ea0 20 20 20 6e 49 6e 4d 75 6c 74 20 74 61 62 6c 65     nInMult table
21eb0 20 73 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e   searches to fin
21ec0 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65 6e  d the initial en
21ed0 74 72 79 20 66 6f 72 20 65 61 63 68 20 72 61 6e  try for each ran
21ee0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 2b  ge.        **  +
21ef0 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f   nRow steps thro
21f00 75 67 68 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ugh the table.  
21f10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21f20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 6e 49 6e   pc.rCost += nIn
21f30 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20  Mul*log10N;.    
21f40 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
21f50 2a 20 41 64 64 20 69 6e 20 74 68 65 20 65 73 74  * Add in the est
21f60 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 73  imated cost of s
21f70 6f 72 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c  orting the resul
21f80 74 2e 20 20 41 63 74 75 61 6c 20 65 78 70 65 72  t.  Actual exper
21f90 69 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d  imental.    ** m
21fa0 65 61 73 75 72 65 6d 65 6e 74 73 20 6f 66 20 73  easurements of s
21fb0 6f 72 74 69 6e 67 20 70 65 72 66 6f 72 6d 61 6e  orting performan
21fc0 63 65 20 69 6e 20 53 51 4c 69 74 65 20 73 68 6f  ce in SQLite sho
21fd0 77 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 74  w that sorting t
21fe0 69 6d 65 0a 20 20 20 20 2a 2a 20 61 64 64 73 20  ime.    ** adds 
21ff0 43 2a 4e 2a 6c 6f 67 31 30 28 4e 29 20 74 6f 20  C*N*log10(N) to 
22000 74 68 65 20 63 6f 73 74 2c 20 77 68 65 72 65 20  the cost, where 
22010 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
22020 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20 0a 20  of rows to be . 
22030 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 61 6e 64     ** sorted and
22040 20 43 20 69 73 20 61 20 66 61 63 74 6f 72 20 62   C is a factor b
22050 65 74 77 65 65 6e 20 31 2e 39 35 20 61 6e 64 20  etween 1.95 and 
22060 34 2e 33 2e 20 20 57 65 20 77 69 6c 6c 20 73 70  4.3.  We will sp
22070 6c 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  lit the.    ** d
22080 69 66 66 65 72 65 6e 63 65 20 61 6e 64 20 73 65  ifference and se
22090 6c 65 63 74 20 43 20 6f 66 20 33 2e 30 2e 0a 20  lect C of 3.0.. 
220a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 53     */.    if( bS
220b0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 64 6f 75  ort ){.      dou
220c0 62 6c 65 20 6d 20 3d 20 65 73 74 4c 6f 67 28 70  ble m = estLog(p
220d0 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a 28 6e 4f 72  c.plan.nRow*(nOr
220e0 64 65 72 42 79 20 2d 20 70 63 2e 70 6c 61 6e 2e  derBy - pc.plan.
220f0 6e 4f 42 53 61 74 29 2f 6e 4f 72 64 65 72 42 79  nOBSat)/nOrderBy
22100 29 3b 0a 20 20 20 20 20 20 6d 20 2a 3d 20 28 64  );.      m *= (d
22110 6f 75 62 6c 65 29 28 70 63 2e 70 6c 61 6e 2e 6e  ouble)(pc.plan.n
22120 4f 42 53 61 74 20 3f 20 32 20 3a 20 33 29 3b 0a  OBSat ? 2 : 3);.
22130 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20 2b        pc.rCost +
22140 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a 6d  = pc.plan.nRow*m
22150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22160 62 44 69 73 74 20 29 7b 0a 20 20 20 20 20 20 70  bDist ){.      p
22170 63 2e 72 43 6f 73 74 20 2b 3d 20 70 63 2e 70 6c  c.rCost += pc.pl
22180 61 6e 2e 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 70  an.nRow*estLog(p
22190 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 2a 33 3b 0a  c.plan.nRow)*3;.
221a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 2a 2a      }..    /****
221b0 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 74   Cost of using t
221c0 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 6e 6f  his index has no
221d0 77 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 20  w been computed 
221e0 2a 2a 2a 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  ****/..    /* If
221f0 20 74 68 65 72 65 20 61 72 65 20 61 64 64 69 74   there are addit
22200 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74  ional constraint
22210 73 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s on this table 
22220 74 68 61 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20  that cannot.    
22230 2a 2a 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ** be used with 
22240 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64 65  the current inde
22250 78 2c 20 62 75 74 20 77 68 69 63 68 20 6d 69 67  x, but which mig
22260 68 74 20 6c 6f 77 65 72 20 74 68 65 20 6e 75 6d  ht lower the num
22270 62 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 6f 75  ber.    ** of ou
22280 74 70 75 74 20 72 6f 77 73 2c 20 61 64 6a 75 73  tput rows, adjus
22290 74 20 74 68 65 20 6e 52 6f 77 20 76 61 6c 75 65  t the nRow value
222a0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 20 54   accordingly.  T
222b0 68 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 2a 2a  his only .    **
222c0 20 6d 61 74 74 65 72 73 20 69 66 20 74 68 65 20   matters if the 
222d0 63 75 72 72 65 6e 74 20 69 6e 64 65 78 20 69 73  current index is
222e0 20 74 68 65 20 6c 65 61 73 74 20 63 6f 73 74 6c   the least costl
222f0 79 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74  y, so do not bot
22300 68 65 72 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  her.    ** with 
22310 74 68 69 73 20 73 74 65 70 20 69 66 20 77 65 20  this step if we 
22320 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 69  already know thi
22330 73 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74  s index will not
22340 20 62 65 20 63 68 6f 73 65 6e 2e 0a 20 20 20 20   be chosen..    
22350 2a 2a 20 41 6c 73 6f 2c 20 6e 65 76 65 72 20 72  ** Also, never r
22360 65 64 75 63 65 20 74 68 65 20 6f 75 74 70 75 74  educe the output
22370 20 72 6f 77 20 63 6f 75 6e 74 20 62 65 6c 6f 77   row count below
22380 20 32 20 75 73 69 6e 67 20 74 68 69 73 20 73 74   2 using this st
22390 65 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ep..    **.    *
223a0 2a 20 49 74 20 69 73 20 63 72 69 74 69 63 61 6c  * It is critical
223b0 20 74 68 61 74 20 74 68 65 20 6e 6f 74 56 61 6c   that the notVal
223c0 69 64 20 6d 61 73 6b 20 62 65 20 75 73 65 64 20  id mask be used 
223d0 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 0a  here instead of.
223e0 20 20 20 20 2a 2a 20 74 68 65 20 6e 6f 74 52 65      ** the notRe
223f0 61 64 79 20 6d 61 73 6b 2e 20 20 57 68 65 6e 20  ady mask.  When 
22400 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 22 6f 70  computing an "op
22410 74 69 6d 61 6c 22 20 69 6e 64 65 78 2c 20 74 68  timal" index, th
22420 65 20 6e 6f 74 52 65 61 64 79 0a 20 20 20 20 2a  e notReady.    *
22430 2a 20 6d 61 73 6b 20 77 69 6c 6c 20 6f 6e 6c 79  * mask will only
22440 20 68 61 76 65 20 6f 6e 65 20 62 69 74 20 73 65   have one bit se
22450 74 20 2d 20 74 68 65 20 62 69 74 20 66 6f 72 20  t - the bit for 
22460 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
22470 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 6f  e..    ** The no
22480 74 56 61 6c 69 64 20 6d 61 73 6b 2c 20 6f 6e 20  tValid mask, on 
22490 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
224a0 61 6c 77 61 79 73 20 68 61 73 20 61 6c 6c 20 62  always has all b
224b0 69 74 73 20 73 65 74 20 66 6f 72 0a 20 20 20 20  its set for.    
224c0 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74 20 61  ** tables that a
224d0 72 65 20 6e 6f 74 20 69 6e 20 6f 75 74 65 72 20  re not in outer 
224e0 6c 6f 6f 70 73 2e 20 20 49 66 20 6e 6f 74 52 65  loops.  If notRe
224f0 61 64 79 20 69 73 20 75 73 65 64 20 68 65 72 65  ady is used here
22500 20 69 6e 73 74 65 61 64 0a 20 20 20 20 2a 2a 20   instead.    ** 
22510 6f 66 20 6e 6f 74 56 61 6c 69 64 2c 20 74 68 65  of notValid, the
22520 6e 20 61 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65  n a optimal inde
22530 78 20 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f  x that depends o
22540 6e 20 69 6e 6e 65 72 20 6a 6f 69 6e 73 20 6c 6f  n inner joins lo
22550 6f 70 73 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74  ops.    ** might
22560 20 62 65 20 73 65 6c 65 63 74 65 64 20 65 76 65   be selected eve
22570 6e 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69  n when there exi
22580 73 74 73 20 61 6e 20 6f 70 74 69 6d 61 6c 20 69  sts an optimal i
22590 6e 64 65 78 20 74 68 61 74 20 68 61 73 0a 20 20  ndex that has.  
225a0 20 20 2a 2a 20 6e 6f 20 73 75 63 68 20 64 65 70    ** no such dep
225b0 65 6e 64 65 6e 63 79 2e 0a 20 20 20 20 2a 2f 0a  endency..    */.
225c0 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e      if( pc.plan.
225d0 6e 52 6f 77 3e 32 20 26 26 20 70 63 2e 72 43 6f  nRow>2 && pc.rCo
225e0 73 74 3c 3d 70 2d 3e 63 6f 73 74 2e 72 43 6f 73  st<=p->cost.rCos
225f0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  t ){.      int k
22600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22610 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
22620 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
22630 20 69 6e 74 20 6e 53 6b 69 70 45 71 20 3d 20 70   int nSkipEq = p
22640 63 2e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a  c.plan.nEq;   /*
22650 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 63 6f   Number of == co
22660 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b 69  nstraints to ski
22670 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  p */.      int n
22680 53 6b 69 70 52 61 6e 67 65 20 3d 20 6e 42 6f 75  SkipRange = nBou
22690 6e 64 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  nd;     /* Numbe
226a0 72 20 6f 66 20 3c 20 63 6f 6e 73 74 72 61 69 6e  r of < constrain
226b0 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ts to skip */.  
226c0 20 20 20 20 42 69 74 6d 61 73 6b 20 74 68 69 73      Bitmask this
226d0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
226e0 20 2f 2a 20 42 69 74 6d 61 70 20 66 6f 72 20 70   /* Bitmap for p
226f0 53 72 63 20 2a 2f 0a 0a 20 20 20 20 20 20 74 68  Src */..      th
22700 69 73 54 61 62 20 3d 20 67 65 74 4d 61 73 6b 28  isTab = getMask(
22710 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69  pWC->pMaskSet, i
22720 43 75 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Cur);.      for(
22730 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d  pTerm=pWC->a, k=
22740 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 70 63 2e 70  pWC->nTerm; pc.p
22750 6c 61 6e 2e 6e 52 6f 77 3e 32 20 26 26 20 6b 3b  lan.nRow>2 && k;
22760 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k--, pTerm++){.
22770 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
22780 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
22790 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e 74  M_VIRTUAL ) cont
227a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
227b0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
227c0 41 6c 6c 20 26 20 70 2d 3e 6e 6f 74 56 61 6c 69  All & p->notVali
227d0 64 29 21 3d 74 68 69 73 54 61 62 20 29 20 63 6f  d)!=thisTab ) co
227e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
227f0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
22800 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
22810 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29  _IN|WO_ISNULL) )
22820 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
22830 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20 20 20 20  nSkipEq ){.     
22840 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65         /* Ignore
22850 20 74 68 65 20 66 69 72 73 74 20 70 63 2e 70 6c   the first pc.pl
22860 61 6e 2e 6e 45 71 20 65 71 75 61 6c 69 74 79 20  an.nEq equality 
22870 6d 61 74 63 68 65 73 20 73 69 6e 63 65 20 74 68  matches since th
22880 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
22890 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
228a0 64 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f 72  dy accounted for
228b0 20 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20 20   these */.      
228c0 20 20 20 20 20 20 6e 53 6b 69 70 45 71 2d 2d 3b        nSkipEq--;
228d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
228e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
228f0 20 41 73 73 75 6d 65 20 65 61 63 68 20 61 64 64   Assume each add
22900 69 74 69 6f 6e 61 6c 20 65 71 75 61 6c 69 74 79  itional equality
22910 20 6d 61 74 63 68 20 72 65 64 75 63 65 73 20 74   match reduces t
22920 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
22930 20 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a        ** set siz
22940 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
22950 20 31 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   10 */.         
22960 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20     pc.plan.nRow 
22970 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20  /= 10;.         
22980 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
22990 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
229a0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
229b0 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
229c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
229d0 66 28 20 6e 53 6b 69 70 52 61 6e 67 65 20 29 7b  f( nSkipRange ){
229e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
229f0 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73 74  Ignore the first
22a00 20 6e 53 6b 69 70 52 61 6e 67 65 20 72 61 6e 67   nSkipRange rang
22a10 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 69  e constraints si
22a20 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20  nce the index.  
22a30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73            ** has
22a40 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74   already account
22a50 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a  ed for these */.
22a60 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69              nSki
22a70 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20 20 20 20  pRange--;.      
22a80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22a90 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
22aa0 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
22ab0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
22ac0 74 20 72 65 64 75 63 65 73 20 74 68 65 20 72 65  t reduces the re
22ad0 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20  sult.           
22ae0 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20   ** set size by 
22af0 61 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 20 20  a factor of 3.  
22b00 49 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63 6f  Indexed range co
22b10 6e 73 74 72 61 69 6e 74 73 20 72 65 64 75 63 65  nstraints reduce
22b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
22b30 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
22b40 20 62 79 20 61 20 6c 61 72 67 65 72 20 66 61 63   by a larger fac
22b50 74 6f 72 3a 20 34 2e 20 20 57 65 20 6d 61 6b 65  tor: 4.  We make
22b60 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65 0a 20   indexed range. 
22b70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f             ** mo
22b80 72 65 20 73 65 6c 65 63 74 69 76 65 20 69 6e 74  re selective int
22b90 65 6e 74 69 6f 6e 61 6c 6c 79 20 62 65 63 61 75  entionally becau
22ba0 73 65 20 6f 66 20 74 68 65 20 73 75 62 6a 65 63  se of the subjec
22bb0 74 69 76 65 20 0a 20 20 20 20 20 20 20 20 20 20  tive .          
22bc0 20 20 2a 2a 20 6f 62 73 65 72 76 61 74 69 6f 6e    ** observation
22bd0 20 74 68 61 74 20 69 6e 64 65 78 65 64 20 72 61   that indexed ra
22be0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
22bf0 72 65 61 6c 6c 79 20 61 72 65 20 6d 6f 72 65 0a  really are more.
22c00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
22c10 65 6c 65 63 74 69 76 65 20 69 6e 20 70 72 61 63  elective in prac
22c20 74 69 63 65 2c 20 6f 6e 20 61 76 65 72 61 67 65  tice, on average
22c30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
22c40 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f 3d   pc.plan.nRow /=
22c50 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   3;.          }.
22c60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
22c70 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
22c80 74 6f 72 20 26 20 57 4f 5f 4e 4f 4f 50 29 3d 3d  tor & WO_NOOP)==
22c90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
22ca0 2a 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  * Any other expr
22cb0 65 73 73 69 6f 6e 20 6c 6f 77 65 72 73 20 74 68  ession lowers th
22cc0 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75  e output row cou
22cd0 6e 74 20 62 79 20 68 61 6c 66 20 2a 2f 0a 20 20  nt by half */.  
22ce0 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
22cf0 6e 52 6f 77 20 2f 3d 20 32 3b 0a 20 20 20 20 20  nRow /= 2;.     
22d00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22d10 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e     if( pc.plan.n
22d20 52 6f 77 3c 32 20 29 20 70 63 2e 70 6c 61 6e 2e  Row<2 ) pc.plan.
22d30 6e 52 6f 77 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  nRow = 2;.    }.
22d40 0a 0a 20 20 20 20 2f 2a 57 48 45 52 45 54 52 41  ..    /*WHERETRA
22d50 43 45 28 28 0a 20 20 20 20 20 20 22 20 20 20 20  CE((.      "    
22d60 20 20 6e 45 71 3d 25 64 20 6e 49 6e 4d 75 6c 3d    nEq=%d nInMul=
22d70 25 64 20 72 61 6e 67 65 44 69 76 3d 25 64 20 62  %d rangeDiv=%d b
22d80 53 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d  Sort=%d bLookup=
22d90 25 64 20 77 73 46 6c 61 67 73 3d 30 78 25 30 38  %d wsFlags=0x%08
22da0 78 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20  x\n".      "    
22db0 20 20 6e 6f 74 52 65 61 64 79 3d 30 78 25 6c 6c    notReady=0x%ll
22dc0 78 20 6c 6f 67 31 30 4e 3d 25 2e 31 66 20 6e 52  x log10N=%.1f nR
22dd0 6f 77 3d 25 2e 31 66 20 63 6f 73 74 3d 25 2e 31  ow=%.1f cost=%.1
22de0 66 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20  f\n".      "    
22df0 20 20 75 73 65 64 3d 30 78 25 6c 6c 78 20 6e 4f    used=0x%llx nO
22e00 42 53 61 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  BSat=%d\n",.    
22e10 20 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 2c 20 6e    pc.plan.nEq, n
22e20 49 6e 4d 75 6c 2c 20 28 69 6e 74 29 72 61 6e 67  InMul, (int)rang
22e30 65 44 69 76 2c 20 62 53 6f 72 74 2c 20 62 4c 6f  eDiv, bSort, bLo
22e40 6f 6b 75 70 2c 20 70 63 2e 70 6c 61 6e 2e 77 73  okup, pc.plan.ws
22e50 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 70 2d 3e  Flags,.      p->
22e60 6e 6f 74 52 65 61 64 79 2c 20 6c 6f 67 31 30 4e  notReady, log10N
22e70 2c 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2c 20  , pc.plan.nRow, 
22e80 70 63 2e 72 43 6f 73 74 2c 20 70 63 2e 75 73 65  pc.rCost, pc.use
22e90 64 2c 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  d,.      pc.plan
22ea0 2e 6e 4f 42 53 61 74 0a 20 20 20 20 29 29 3b 2a  .nOBSat.    ));*
22eb0 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  /..    /* If thi
22ec0 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 62  s index is the b
22ed0 65 73 74 20 77 65 20 68 61 76 65 20 73 65 65 6e  est we have seen
22ee0 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 72 65   so far, then re
22ef0 63 6f 72 64 20 74 68 69 73 0a 20 20 20 20 2a 2a  cord this.    **
22f00 20 69 6e 64 65 78 20 61 6e 64 20 69 74 73 20 63   index and its c
22f10 6f 73 74 20 69 6e 20 74 68 65 20 70 2d 3e 63 6f  ost in the p->co
22f20 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  st structure..  
22f30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70    */.    if( (!p
22f40 49 64 78 20 7c 7c 20 70 63 2e 70 6c 61 6e 2e 77  Idx || pc.plan.w
22f50 73 46 6c 61 67 73 29 20 26 26 20 63 6f 6d 70 61  sFlags) && compa
22f60 72 65 43 6f 73 74 28 26 70 63 2c 20 26 70 2d 3e  reCost(&pc, &p->
22f70 63 6f 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  cost) ){.      p
22f80 2d 3e 63 6f 73 74 20 3d 20 70 63 3b 0a 20 20 20  ->cost = pc;.   
22f90 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e     p->cost.plan.
22fa0 77 73 46 6c 61 67 73 20 26 3d 20 77 73 46 6c 61  wsFlags &= wsFla
22fb0 67 4d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  gMask;.      p->
22fc0 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
22fd0 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a 0a   = pIdx;.    }..
22fe0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
22ff0 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
23000 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f  Y clause, then o
23010 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64  nly that one ind
23020 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ex is.    ** con
23030 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20  sidered. */.    
23040 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
23050 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
23060 2a 20 52 65 73 65 74 20 6d 61 73 6b 73 20 66 6f  * Reset masks fo
23070 72 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  r the next index
23080 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   in the loop */.
23090 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d      wsFlagMask =
230a0 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   ~(WHERE_ROWID_E
230b0 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
230c0 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d  NGE);.    eqTerm
230d0 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d  Mask = idxEqTerm
230e0 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Mask;.  }..  /* 
230f0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
23100 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
23110 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65  nd the SQLITE_Re
23120 76 65 72 73 65 4f 72 64 65 72 20 66 6c 61 67 0a  verseOrder flag.
23130 20 20 2a 2a 20 69 73 20 73 65 74 2c 20 74 68 65    ** is set, the
23140 6e 20 72 65 76 65 72 73 65 20 74 68 65 20 6f 72  n reverse the or
23150 64 65 72 20 74 68 61 74 20 74 68 65 20 69 6e 64  der that the ind
23160 65 78 20 77 69 6c 6c 20 62 65 20 73 63 61 6e 6e  ex will be scann
23170 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54 68 69 73  ed.  ** in. This
23180 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 70 70   is used for app
23190 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e 67  lication testing
231a0 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e 64 20 63  , to help find c
231b0 61 73 65 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  ases.  ** where 
231c0 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 65 68 61  application beha
231d0 76 69 6f 72 20 64 65 70 65 6e 64 73 20 6f 6e 20  vior depends on 
231e0 74 68 65 20 28 75 6e 64 65 66 69 6e 65 64 29 20  the (undefined) 
231f0 6f 72 64 65 72 20 74 68 61 74 0a 20 20 2a 2a 20  order that.  ** 
23200 53 51 4c 69 74 65 20 6f 75 74 70 75 74 73 20 72  SQLite outputs r
23210 6f 77 73 20 69 6e 20 69 6e 20 74 68 65 20 61 62  ows in in the ab
23220 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f 52 44 45  sence of an ORDE
23230 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 2a 2f  R BY clause.  */
23240 0a 20 20 69 66 28 20 21 70 2d 3e 70 4f 72 64 65  .  if( !p->pOrde
23250 72 42 79 20 26 26 20 70 50 61 72 73 65 2d 3e 64  rBy && pParse->d
23260 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
23270 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 29  E_ReverseOrder )
23280 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c  {.    p->cost.pl
23290 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
232a0 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 7d  ERE_REVERSE;.  }
232b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
232c0 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 2d 3e 63  OrderBy || (p->c
232d0 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
232e0 26 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 3d  &WHERE_ORDERED)=
232f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23300 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70  p->cost.plan.u.p
23310 49 64 78 3d 3d 30 20 7c 7c 20 28 70 2d 3e 63 6f  Idx==0 || (p->co
23320 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26  st.plan.wsFlags&
23330 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3d  WHERE_ROWID_EQ)=
23340 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23350 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  pSrc->pIndex==0 
23360 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 63 6f  .       || p->co
23370 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  st.plan.u.pIdx==
23380 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  0 .       || p->
23390 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
233a0 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 0a  ==pSrc->pIndex .
233b0 20 20 29 3b 0a 0a 20 20 2f 2a 57 48 45 52 45 54    );..  /*WHERET
233c0 52 41 43 45 28 28 22 20 20 20 62 65 73 74 20 69  RACE(("   best i
233d0 6e 64 65 78 20 69 73 20 25 73 20 63 6f 73 74 3d  ndex is %s cost=
233e0 25 2e 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %.1f\n",.       
233f0 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75    p->cost.plan.u
23400 2e 70 49 64 78 20 3f 20 70 2d 3e 63 6f 73 74 2e  .pIdx ? p->cost.
23410 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
23420 6d 65 20 3a 20 22 69 70 6b 22 2c 0a 20 20 20 20  me : "ipk",.    
23430 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f       p->cost.rCo
23440 73 74 29 29 3b 2a 2f 0a 20 20 0a 20 20 62 65 73  st));*/.  .  bes
23450 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70  tOrClauseIndex(p
23460 29 3b 0a 20 20 62 65 73 74 41 75 74 6f 6d 61 74  );.  bestAutomat
23470 69 63 49 6e 64 65 78 28 70 29 3b 0a 20 20 69 66  icIndex(p);.  if
23480 28 20 65 71 54 65 72 6d 4d 61 73 6b 20 26 20 57  ( eqTermMask & W
23490 4f 5f 49 53 4e 55 4c 4c 20 29 20 70 2d 3e 63 6f  O_ISNULL ) p->co
234a0 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
234b0 7c 3d 20 57 48 45 52 45 5f 4e 55 4c 4c 5f 4f 4b  |= WHERE_NULL_OK
234c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
234d0 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66  the query plan f
234e0 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 61 62  or accessing tab
234f0 6c 65 20 70 53 72 63 2d 3e 70 54 61 62 2e 20 57  le pSrc->pTab. W
23500 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74  rite the.** best
23510 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20   query plan and 
23520 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68  its cost into th
23530 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65  e WhereCost obje
23540 63 74 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ct supplied .** 
23550 61 73 20 74 68 65 20 6c 61 73 74 20 70 61 72 61  as the last para
23560 6d 65 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  meter. This func
23570 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61  tion may calcula
23580 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a  te the cost of.*
23590 2a 20 62 6f 74 68 20 72 65 61 6c 20 61 6e 64 20  * both real and 
235a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63  virtual table sc
235b0 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ans..**.** This 
235c0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
235d0 74 20 74 61 6b 65 20 4f 52 44 45 52 20 42 59 20  t take ORDER BY 
235e0 6f 72 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f  or DISTINCT into
235f0 20 61 63 63 6f 75 6e 74 2e 20 20 4e 6f 72 0a 2a   account.  Nor.*
23600 2a 20 64 6f 65 73 20 69 74 20 72 65 6d 65 6d 62  * does it rememb
23610 65 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  er the virtual t
23620 61 62 6c 65 20 71 75 65 72 79 20 70 6c 61 6e 2e  able query plan.
23630 20 20 41 6c 6c 20 69 74 20 64 6f 65 73 20 69 73    All it does is
23640 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
23650 63 6f 73 74 20 77 68 69 6c 65 20 64 65 74 65 72  cost while deter
23660 6d 69 6e 69 6e 67 20 69 66 20 61 6e 20 4f 52 20  mining if an OR 
23670 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
23680 61 70 70 6c 69 63 61 62 6c 65 2e 20 20 54 68 65  applicable.  The
23690 0a 2a 2a 20 64 65 74 61 69 6c 73 20 77 69 6c 6c  .** details will
236a0 20 62 65 20 72 65 63 6f 6e 73 69 64 65 72 65 64   be reconsidered
236b0 20 6c 61 74 65 72 20 69 66 20 74 68 65 20 6f 70   later if the op
236c0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 66 6f  timization is fo
236d0 75 6e 64 20 74 6f 20 62 65 0a 2a 2a 20 61 70 70  und to be.** app
236e0 6c 69 63 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  licable..*/.stat
236f0 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65  ic void bestInde
23700 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20 2a  x(WhereBestIdx *
23710 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p){.#ifndef SQLI
23720 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
23730 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
23740 74 75 61 6c 28 70 2d 3e 70 53 72 63 2d 3e 70 54  tual(p->pSrc->pT
23750 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
23760 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
23770 49 64 78 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20  IdxInfo = 0;.   
23780 20 70 2d 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20   p->ppIdxInfo = 
23790 26 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 62  &pIdxInfo;.    b
237a0 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
237b0 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
237c0 70 49 64 78 49 6e 66 6f 21 3d 30 20 7c 7c 20 70  pIdxInfo!=0 || p
237d0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ->pParse->db->ma
237e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
237f0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 20 26    if( pIdxInfo &
23800 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  & pIdxInfo->need
23810 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a  ToFreeIdxStr ){.
23820 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23830 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
23840 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Str);.    }.    
23850 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
23860 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 64  >pParse->db, pId
23870 78 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 0a  xInfo);.  }else.
23880 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 62  #endif.  {.    b
23890 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70 29  estBtreeIndex(p)
238a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
238b0 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
238c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
238d0 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
238e0 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
238f0 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
23900 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
23910 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
23920 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
23930 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
23940 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
23950 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
23960 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
23970 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
23980 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
23990 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
239a0 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
239b0 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
239c0 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
239d0 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
239e0 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
239f0 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
23a00 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
23a10 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
23a20 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
23a30 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
23a40 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
23a50 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
23a60 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
23a70 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
23a80 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
23a90 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
23aa0 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
23ab0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
23ac0 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
23ad0 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
23ae0 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
23af0 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
23b00 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
23b10 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
23b20 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  isabled..**.** I
23b30 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
23b40 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35 20  : R-24597-58655 
23b50 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f 6e  No tests are don
23b60 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74  e for terms that
23b70 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65   are.** complete
23b80 6c 79 20 73 61 74 69 73 66 69 65 64 20 62 79 20  ly satisfied by 
23b90 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44  indices..**.** D
23ba0 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
23bb0 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
23bc0 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
23bd0 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
23be0 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
23bf0 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
23c00 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
23c10 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
23c20 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
23c30 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
23c40 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
23c50 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
23c60 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
23c70 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
23c80 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
23c90 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
23ca0 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
23cb0 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
23cc0 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
23cd0 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
23ce0 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
23cf0 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
23d00 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
23d10 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
23d20 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
23d30 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
23d40 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
23d50 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
23d60 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
23d70 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69  t #813..*/.stati
23d80 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
23d90 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
23da0 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
23db0 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20   *pTerm){.  if( 
23dc0 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28  pTerm.      && (
23dd0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
23de0 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a   TERM_CODED)==0.
23df0 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
23e00 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
23e10 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
23e20 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
23e30 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
23e40 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  ){.    pTerm->wt
23e50 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
23e60 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
23e70 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
23e80 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
23e90 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
23ea0 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
23eb0 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
23ec0 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
23ed0 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
23ee0 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
23ef0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
23f00 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
23f10 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
23f20 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69  ode an OP_Affini
23f30 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70  ty opcode to app
23f40 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  ly the column af
23f50 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41  finity string zA
23f60 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72  ff.** to the n r
23f70 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
23f80 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a  g at base. .**.*
23f90 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  * As an optimiza
23fa0 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46  tion, SQLITE_AFF
23fb0 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77  _NONE entries (w
23fc0 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29  hich are no-ops)
23fd0 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e   at the.** begin
23fe0 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20  ning and end of 
23ff0 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64  zAff are ignored
24000 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65  .  If all entrie
24010 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a  s in zAff are.**
24020 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
24030 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67  , then no code g
24040 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  ets generated..*
24050 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24060 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20  e makes its own 
24070 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20  copy of zAff so 
24080 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
24090 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f  is free.** to mo
240a0 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20  dify zAff after 
240b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
240c0 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  urns..*/.static 
240d0 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66  void codeApplyAf
240e0 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
240f0 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20  arse, int base, 
24100 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66  int n, char *zAf
24110 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  f){.  Vdbe *v = 
24120 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
24130 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a   if( zAff==0 ){.
24140 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
24150 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
24160 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
24170 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
24180 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
24190 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20  Adjust base and 
241a0 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53  n to skip over S
241b0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
241c0 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65  ntries at the be
241d0 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64  ginning.  ** and
241e0 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69   end of the affi
241f0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a  nity string..  *
24200 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  /.  while( n>0 &
24210 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54  & zAff[0]==SQLIT
24220 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
24230 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b    n--;.    base+
24240 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20  +;.    zAff++;. 
24250 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20   }.  while( n>1 
24260 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51  && zAff[n-1]==SQ
24270 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
24280 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20  .    n--;.  }.. 
24290 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f   /* Code the OP_
242a0 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
242b0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74  if there is anyt
242c0 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e  hing left to do.
242d0 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b   */.  if( n>0 ){
242e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
242f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66  AddOp2(v, OP_Aff
24300 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b  inity, base, n);
24310 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
24320 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
24330 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71  zAff, n);.    sq
24340 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
24350 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
24360 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  rse, base, n);. 
24370 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
24380 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
24390 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
243a0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
243b0 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
243c0 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
243d0 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
243e0 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
243f0 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
24400 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
24410 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
24420 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
24430 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
24440 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72  int is left in r
24450 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a  egister iReg..**
24460 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
24470 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
24480 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
24490 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
244a0 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
244b0 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
244c0 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
244d0 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
244e0 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
244f0 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
24500 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
24510 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
24520 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
24530 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
24540 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71  tatic int codeEq
24550 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
24560 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
24570 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
24580 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
24590 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
245a0 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
245b0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
245c0 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
245d0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
245e0 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65  Level, /* The le
245f0 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  vel of the FROM 
24600 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f  clause we are wo
24610 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e  rking on */.  in
24620 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20  t iEq,          
24630 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
24640 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
24650 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65  within this leve
24660 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  l */.  int iTarg
24670 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
24680 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
24690 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
246a0 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
246b0 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
246c0 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
246d0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
246e0 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24700 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
24710 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
24720 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
24730 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
24740 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20  ->op==TK_EQ ){. 
24750 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
24760 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
24770 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
24780 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
24790 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
247a0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
247b0 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
247c0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
247d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
247e0 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
247f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24800 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
24810 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
24820 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
24830 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
24840 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 75 38  oop *pIn;.    u8
24850 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d   bRev = (pLevel-
24860 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
24870 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d  WHERE_REVERSE)!=
24880 30 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 65  0;..    if( (pLe
24890 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
248a0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
248b0 44 29 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20  D)!=0 .      && 
248c0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
248d0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
248e0 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  iEq].    ){.    
248f0 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d    testcase( iEq=
24900 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
24910 63 61 73 65 28 20 69 45 71 3d 3d 70 4c 65 76 65  case( iEq==pLeve
24920 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
24930 6e 43 6f 6c 75 6d 6e 2d 31 20 29 3b 0a 20 20 20  nColumn-1 );.   
24940 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71     testcase( iEq
24950 3e 30 20 26 26 20 69 45 71 2b 31 3c 70 4c 65 76  >0 && iEq+1<pLev
24960 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  el->plan.u.pIdx-
24970 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  >nColumn );.    
24980 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
24990 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
249a0 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
249b0 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
249c0 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69  ==TK_IN );.    i
249d0 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
249e0 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74     eType = sqlit
249f0 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
24a00 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20  arse, pX, 0);.  
24a10 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
24a20 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
24a30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
24a40 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
24a50 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
24a60 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d      }.    iTab =
24a70 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
24a80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24a90 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
24aa0 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
24ab0 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
24ac0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
24ad0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
24ae0 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a  HERE_IN_ABLE );.
24af0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
24b00 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  u.in.nIn==0 ){. 
24b10 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
24b20 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
24b30 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
24b40 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
24b50 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20  ->u.in.nIn++;.  
24b60 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61    pLevel->u.in.a
24b70 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20  InLoop =.       
24b80 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
24b90 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  OrFree(pParse->d
24ba0 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
24bb0 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bd0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
24be0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
24bf0 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75  op[0])*pLevel->u
24c00 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49  .in.nIn);.    pI
24c10 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  n = pLevel->u.in
24c20 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  .aInLoop;.    if
24c30 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70  ( pIn ){.      p
24c40 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  In += pLevel->u.
24c50 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20  in.nIn - 1;.    
24c60 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54    pIn->iCur = iT
24c70 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  ab;.      if( eT
24c80 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
24c90 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WID ){.        p
24ca0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
24cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24cc0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
24cd0 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Tab, iReg);.    
24ce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24cf0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
24d00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
24d10 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
24d20 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29  , iTab, 0, iReg)
24d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24d40 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20  pIn->eEndLoopOp 
24d50 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
24d60 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
24d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24d80 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
24d90 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c  , iReg);.    }el
24da0 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
24db0 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a  ->u.in.nIn = 0;.
24dc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
24dd0 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70  .  disableTerm(p
24de0 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
24df0 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
24e00 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24e10 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
24e20 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61  valuate all == a
24e30 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
24e40 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65  s for an.** inde
24e50 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  x..**.** For exa
24e60 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74  mple, consider t
24e70 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c  able t1(a,b,c,d,
24e80 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20  e,f) with index 
24e90 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75  i1(a,b,c)..** Su
24ea0 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20  ppose the WHERE 
24eb0 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20  clause is this: 
24ec0 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28   a==5 AND b IN (
24ed0 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41  1,2,3) AND c>5 A
24ee0 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69  ND c<10.** The i
24ef0 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79  ndex has as many
24f00 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69   as three equali
24f10 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
24f20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65  but in this.** e
24f30 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72  xample, the thir
24f40 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61  d "c" value is a
24f50 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53  n inequality.  S
24f60 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63  o only two .** c
24f70 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
24f80 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  oded.  This rout
24f90 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ine will generat
24fa0 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
24fb0 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62  te.** a==5 and b
24fc0 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68   IN (1,2,3).  Th
24fd0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
24fe0 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c   for a and b wil
24ff0 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69  l be stored.** i
25000 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  n consecutive re
25010 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
25020 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72  index of the fir
25030 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72  st register is r
25040 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
25050 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
25060 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74  ove nEq==2.  But
25070 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
25080 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76   works for any v
25090 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69  alue.** of nEq i
250a0 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20  ncluding 0.  If 
250b0 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75  nEq==0, this rou
250c0 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61  tine is nearly a
250d0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f   no-op..** The o
250e0 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65  nly thing it doe
250f0 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68  s is allocate th
25100 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d  e pLevel->iMem m
25110 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a  emory cell and.*
25120 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66  * compute the af
25130 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a  finity string..*
25140 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
25150 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74  e always allocat
25160 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  es at least one 
25170 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
25180 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69  returns.** the i
25190 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d  ndex of that mem
251a0 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f  ory cell. The co
251b0 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73  de that.** calls
251c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
251d0 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f  ll use that memo
251e0 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65  ry cell to store
251f0 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
25200 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66  .** key value of
25210 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f   the loop.  If o
25220 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70  ne or more IN op
25230 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20  erators appear, 
25240 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
25250 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
25260 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71  n additional nEq
25270 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
25280 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
25290 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
252a0 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66  returning, *pzAf
252b0 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  f is set to poin
252c0 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
252d0 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f  ntaining a.** co
252e0 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
252f0 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
25300 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c   of the index al
25310 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
25320 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
25330 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72  (). Except, entr
25340 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20  ies in the copy 
25350 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  of the string as
25360 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
25370 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
25380 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e  aints that use N
25390 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65  ONE affinity are
253a0 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54   set to.** SQLIT
253b0 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73  E_AFF_NONE. This
253c0 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68   is to deal with
253d0 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65   SQL such as the
253e0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
253f0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
25400 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41   t1(a TEXT PRIMA
25410 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20  RY KEY, b);.**  
25420 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
25430 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48   t1 AS t2, t1 WH
25440 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b  ERE t1.a = t2.b;
25450 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
25460 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
25470 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20   index on t1(a) 
25480 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74  has TEXT affinit
25490 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20  y. But since.** 
254a0 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73  the right hand s
254b0 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c  ide of the equal
254c0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
254d0 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61  t2.b) has NONE a
254e0 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63  ffinity,.** no c
254f0 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64  onversion should
25500 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65   be attempted be
25510 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e  fore using a t2.
25520 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20  b value as part 
25530 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73  of.** a key to s
25540 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e  earch the index.
25550 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74   Hence the first
25560 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74   byte in the ret
25570 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a  urned affinity.*
25580 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73  * string in this
25590 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62   example would b
255a0 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
255b0 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  AFF_NONE..*/.sta
255c0 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
255d0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
255e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
255f0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
25600 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
25610 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
25620 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
25630 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
25640 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
25650 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ng */.  WhereCla
25660 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
25670 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
25680 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
25690 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20  otReady,     /* 
256a0 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46  Which parts of F
256b0 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74  ROM have not yet
256c0 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20   been coded */. 
256d0 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20   int nExtraReg, 
256e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
256f0 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
25700 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ers to allocate 
25710 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66  */.  char **pzAf
25720 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  f          /* OU
25730 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20  T: Set to point 
25740 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  to affinity stri
25750 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ng */.){.  int n
25760 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  Eq = pLevel->pla
25770 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65 20  n.nEq;   /* The 
25780 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  number of == or 
25790 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  IN constraints t
257a0 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65  o code */.  Vdbe
257b0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
257c0 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
257d0 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   vm under constr
257e0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
257f0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
25800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25810 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65   index being use
25820 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20  d for this loop 
25830 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20  */.  int iCur = 
25840 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b  pLevel->iTabCur;
25850 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
25860 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
25870 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
25880 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
25890 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e   /* A single con
258a0 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a  straint term */.
258b0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258d0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
258e0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
258f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25900 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73     /* Base regis
25910 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ter */.  int nRe
25920 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
25930 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25940 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
25950 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
25960 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20  har *zAff;      
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25980 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
25990 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
259a0 6e 74 20 65 71 46 6c 61 67 73 3b 20 20 20 20 20  nt eqFlags;     
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
259c0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 20 61 6e 64 20  WO_EQ|WO_IN and 
259d0 6d 61 79 62 65 20 61 6c 73 6f 20 57 4f 5f 49 53  maybe also WO_IS
259e0 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  NULL */..  /* Th
259f0 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c  is module is onl
25a00 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72  y called on quer
25a10 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65  y plans that use
25a20 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20   an index. */.  
25a30 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
25a40 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
25a50 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a  HERE_INDEXED );.
25a60 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
25a70 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20  >plan.u.pIdx;.. 
25a80 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
25a90 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63  ow many memory c
25aa0 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  ells we will nee
25ab0 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  d then allocate 
25ac0 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67  them..  */.  reg
25ad0 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Base = pParse->n
25ae0 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20  Mem + 1;.  nReg 
25af0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  = pLevel->plan.n
25b00 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a  Eq + nExtraReg;.
25b10 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
25b20 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20  = nReg;..  zAff 
25b30 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
25b40 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71  p(pParse->db, sq
25b50 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
25b60 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b  tyStr(v, pIdx));
25b70 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a  .  if( !zAff ){.
25b80 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
25b90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
25ba0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c  ;.  }..  /* Eval
25bb0 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
25bc0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
25bd0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
25be0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20  x->nColumn>=nEq 
25bf0 29 3b 0a 20 20 65 71 46 6c 61 67 73 20 3d 20 28  );.  eqFlags = (
25c00 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
25c10 6c 61 67 73 26 57 48 45 52 45 5f 4e 55 4c 4c 5f  lags&WHERE_NULL_
25c20 4f 4b 29 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f  OK) ? (WO_EQ|WO_
25c30 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 0a 20 20  IN|WO_ISNULL).  
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
25c70 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e 29 3b 0a   (WO_EQ|WO_IN);.
25c80 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71    for(j=0; j<nEq
25c90 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; j++){.    int 
25ca0 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20  r1;.    int k = 
25cb0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
25cc0 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  ];.    pTerm = f
25cd0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
25ce0 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
25cf0 65 71 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a  eqFlags, pIdx);.
25d00 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
25d10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 2f 2a   ) break;.    /*
25d20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
25d30 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20  rue for indices 
25d40 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63  with redundant c
25d50 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20  olumns. .    ** 
25d60 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58  Ex: CREATE INDEX
25d70 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29   i1 ON t1(a,b,a)
25d80 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
25d90 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44  t1 WHERE a=0 AND
25da0 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73   b=0; */.    tes
25db0 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77  tcase( (pTerm->w
25dc0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
25dd0 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  DED)!=0 );.    t
25de0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
25df0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
25e00 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
25e10 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
25e20 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45  /.    r1 = codeE
25e30 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
25e40 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
25e50 6c 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29  l, j, regBase+j)
25e60 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65  ;.    if( r1!=re
25e70 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20  gBase+j ){.     
25e80 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
25e90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
25ea0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
25eb0 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a  arse, regBase);.
25ec0 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
25ed0 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = r1;.      }els
25ee0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
25ef0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25f00 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65  OP_SCopy, r1, re
25f10 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
25f20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  }.    }.    test
25f30 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
25f40 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
25f50 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
25f60 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
25f70 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
25f80 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
25f90 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
25fa0 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d  ISNULL|WO_IN))==
25fb0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
25fc0 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
25fd0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
25fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25ff0 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
26000 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
26010 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  se+j, pLevel->ad
26020 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66  drBrk);.      if
26030 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20  ( zAff ){.      
26040 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
26050 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
26060 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53  ght, zAff[j])==S
26070 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
26080 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
26090 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
260a0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
260b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
260c0 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
260d0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
260e0 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29  ight, zAff[j]) )
260f0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
26100 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
26110 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
26120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26130 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41   }.  *pzAff = zA
26140 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  ff;.  return reg
26150 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Base;.}..#ifndef
26160 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
26170 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LAIN./*.** This 
26180 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c  routine is a hel
26190 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49  per for explainI
261a0 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f  ndexRange() belo
261b0 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c  w.**.** pStr hol
261c0 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61  ds the text of a
261d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
261e0 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e  t we are buildin
261f0 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a  g up one term.**
26200 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
26210 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61  s routine adds a
26220 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65   new term to the
26230 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72   end of the expr
26240 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73  ession..** Terms
26250 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62   are separated b
26260 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65  y AND so add the
26270 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20   "AND" text for 
26280 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
26290 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f  quent.** terms o
262a0 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nly..*/.static v
262b0 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e  oid explainAppen
262c0 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75  dTerm(.  StrAccu
262d0 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20  m *pStr,        
262e0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
262f0 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e   expression bein
26300 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74  g built */.  int
26310 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20   iTerm,         
26320 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
26330 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20  x of this term. 
26340 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a   First is zero *
26350 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
26360 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  zColumn,        
26370 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
26380 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
26390 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20   char *zOp      
263a0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
263b0 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a  f the operator *
263c0 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d  /.){.  if( iTerm
263d0 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
263e0 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
263f0 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71   AND ", 5);.  sq
26400 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
26410 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d  end(pStr, zColum
26420 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  n, -1);.  sqlite
26430 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
26440 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20  pStr, zOp, 1);. 
26450 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
26460 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22  Append(pStr, "?"
26470 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 1);.}../*.** A
26480 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64  rgument pLevel d
26490 65 73 63 72 69 62 65 73 20 61 20 73 74 72 61 74  escribes a strat
264a0 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67  egy for scanning
264b0 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69   table pTab. Thi
264c0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
264d0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
264e0 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66   to a string buf
264f0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
26500 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20   description.** 
26510 6f 66 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  of the subset of
26520 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e   table rows scan
26530 6e 65 64 20 62 79 20 74 68 65 20 73 74 72 61 74  ned by the strat
26540 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20  egy in the form 
26550 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70  of an.** SQL exp
26560 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20  ression. Or, if 
26570 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61  all rows are sca
26580 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65  nned, NULL is re
26590 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  turned..**.** Fo
265a0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
265b0 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
265c0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
265d0 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20  1 WHERE a=1 AND 
265e0 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75  b>2;.**.** is ru
265f0 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  n and there is a
26600 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62  n index on (a, b
26610 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ), then this fun
26620 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a  ction returns a.
26630 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61  ** string simila
26640 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61  r to:.**.**   "a
26650 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a  =? AND b>?".**.*
26660 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70  * The returned p
26670 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ointer points to
26680 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
26690 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
266a0 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69  alloc()..** It i
266b0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
266c0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
266d0 65 72 20 74 6f 20 66 72 65 65 20 74 68 65 20 62  er to free the b
266e0 75 66 66 65 72 20 77 68 65 6e 20 69 74 20 69 73  uffer when it is
266f0 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65  .** no longer re
26700 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
26710 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49  c char *explainI
26720 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65  ndexRange(sqlite
26730 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 65 76 65  3 *db, WhereLeve
26740 6c 20 2a 70 4c 65 76 65 6c 2c 20 54 61 62 6c 65  l *pLevel, Table
26750 20 2a 70 54 61 62 29 7b 0a 20 20 57 68 65 72 65   *pTab){.  Where
26760 50 6c 61 6e 20 2a 70 50 6c 61 6e 20 3d 20 26 70  Plan *pPlan = &p
26770 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b 0a 20 20 49  Level->plan;.  I
26780 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
26790 50 6c 61 6e 2d 3e 75 2e 70 49 64 78 3b 0a 20 20  Plan->u.pIdx;.  
267a0 69 6e 74 20 6e 45 71 20 3d 20 70 50 6c 61 6e 2d  int nEq = pPlan-
267b0 3e 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  >nEq;.  int i, j
267c0 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
267d0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20   = pTab->aCol;. 
267e0 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d   int *aiColumn =
267f0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
26800 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78  n;.  StrAccum tx
26810 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  t;..  if( nEq==0
26820 20 26 26 20 28 70 50 6c 61 6e 2d 3e 77 73 46 6c   && (pPlan->wsFl
26830 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
26840 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
26850 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20  _LIMIT))==0 ){. 
26860 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
26870 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
26880 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20  umInit(&txt, 0, 
26890 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  0, SQLITE_MAX_LE
268a0 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20  NGTH);.  txt.db 
268b0 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53  = db;.  sqlite3S
268c0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
268d0 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20  xt, " (", 2);.  
268e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20  for(i=0; i<nEq; 
268f0 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  i++){.    explai
26900 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
26910 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  , i, aCol[aiColu
26920 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d  mn[i]].zName, "=
26930 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69  ");.  }..  j = i
26940 3b 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77  ;.  if( pPlan->w
26950 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d  sFlags&WHERE_BTM
26960 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68  _LIMIT ){.    ch
26970 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64  ar *z = (j==pInd
26980 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20  ex->nColumn ) ? 
26990 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
269a0 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
269b0 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  e;.    explainAp
269c0 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
269d0 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d  ++, z, ">");.  }
269e0 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73  .  if( pPlan->ws
269f0 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f  Flags&WHERE_TOP_
26a00 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61  LIMIT ){.    cha
26a10 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65  r *z = (j==pInde
26a20 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22  x->nColumn ) ? "
26a30 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69  rowid" : aCol[ai
26a40 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
26a50 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  ;.    explainApp
26a60 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c  endTerm(&txt, i,
26a70 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20   z, "<");.  }.  
26a80 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
26a90 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c  ppend(&txt, ")",
26aa0 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71   1);.  return sq
26ab0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
26ac0 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a  ish(&txt);.}../*
26ad0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26ae0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c  n is a no-op unl
26af0 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72  ess currently pr
26b00 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c  ocessing an EXPL
26b10 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a  AIN QUERY PLAN.*
26b20 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68  * command. If th
26b30 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f  e query being co
26b40 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50  mpiled is an EXP
26b50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c  LAIN QUERY PLAN,
26b60 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63   a single.** rec
26b70 6f 72 64 20 69 73 20 61 64 64 65 64 20 74 6f 20  ord is added to 
26b80 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65  the output to de
26b90 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65  scribe the table
26ba0 20 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69   scan strategy i
26bb0 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f  n .** pLevel..*/
26bc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
26bd0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50  lainOneScan(.  P
26be0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26c00 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
26c10 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
26c20 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
26c30 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69       /* Table li
26c40 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66  st this loop ref
26c50 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72  ers to */.  Wher
26c60 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
26c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26c80 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f  can to write OP_
26c90 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66  Explain opcode f
26ca0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  or */.  int iLev
26cb0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
26cc0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
26cd0 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c   for "level" col
26ce0 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
26cf0 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d10 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
26d20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66  "from" column of
26d30 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36   output */.  u16
26d40 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d60 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  Flags passed to 
26d70 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
26d80 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  n() */.){.  if( 
26d90 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
26da0 3d 32 20 29 7b 0a 20 20 20 20 75 33 32 20 66 6c  =2 ){.    u32 fl
26db0 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  ags = pLevel->pl
26dc0 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  an.wsFlags;.    
26dd0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
26de0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
26df0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
26e00 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64  ->iFrom];.    Vd
26e10 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
26e20 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56  pVdbe;      /* V
26e30 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  M being construc
26e40 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ted */.    sqlit
26e50 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
26e60 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  >db;     /* Data
26e70 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
26e80 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20     char *zMsg;  
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20   /* Text to add 
26eb0 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f  to EQP output */
26ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
26ed0 36 34 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  64 nRow;        
26ee0 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e     /* Expected n
26ef0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69  umber of rows vi
26f00 73 69 74 65 64 20 62 79 20 73 63 61 6e 20 2a 2f  sited by scan */
26f10 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70  .    int iId = p
26f20 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
26f30 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20  ;  /* Select id 
26f40 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75  (left-most outpu
26f50 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20  t column) */.   
26f60 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20   int isSearch;  
26f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f80 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41  * True for a SEA
26f90 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53  RCH. False for S
26fa0 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 28  CAN. */..    if(
26fb0 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55   (flags&WHERE_MU
26fc0 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72  LTI_OR) || (wctr
26fd0 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45  lFlags&WHERE_ONE
26fe0 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65  TABLE_ONLY) ) re
26ff0 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61  turn;..    isSea
27000 72 63 68 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70  rch = (pLevel->p
27010 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20 20 20 20 20  lan.nEq>0).     
27020 20 20 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67          || (flag
27030 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  s&(WHERE_BTM_LIM
27040 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
27050 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IT))!=0.        
27060 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
27070 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52  ags&(WHERE_ORDER
27080 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44  BY_MIN|WHERE_ORD
27090 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20  ERBY_MAX));..   
270a0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
270b0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
270c0 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52 43   isSearch?"SEARC
270d0 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20  H":"SCAN");.    
270e0 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
270f0 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  ct ){.      zMsg
27100 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
27110 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
27120 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a   SUBQUERY %d", z
27130 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65  Msg,pItem->iSele
27140 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ctId);.    }else
27150 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
27160 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
27170 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42  b, zMsg, "%s TAB
27180 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  LE %s", zMsg, pI
27190 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
271a0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65   }..    if( pIte
271b0 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
271c0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
271d0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
271e0 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20  sg, "%s AS %s", 
271f0 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
27200 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ias);.    }.    
27210 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
27220 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
27230 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57  {.      char *zW
27240 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e  here = explainIn
27250 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 65  dexRange(db, pLe
27260 76 65 6c 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  vel, pItem->pTab
27270 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  );.      zMsg = 
27280 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
27290 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
272a0 49 4e 47 20 25 73 25 73 49 4e 44 45 58 25 73 25  ING %s%sINDEX%s%
272b0 73 25 73 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20  s%s", zMsg, .   
272c0 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
272d0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
272e0 58 29 3f 22 41 55 54 4f 4d 41 54 49 43 20 22 3a  X)?"AUTOMATIC ":
272f0 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28  ""),.          (
27300 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  (flags & WHERE_I
27310 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49  DX_ONLY)?"COVERI
27320 4e 47 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20  NG ":""),.      
27330 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
27340 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f  ERE_TEMP_INDEX)?
27350 22 22 3a 22 20 22 29 2c 0a 20 20 20 20 20 20 20  "":" "),.       
27360 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
27370 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22  RE_TEMP_INDEX)?"
27380 22 3a 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ": pLevel->plan.
27390 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a  u.pIdx->zName),.
273a0 20 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65            zWhere
273b0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
273c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
273d0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  , zWhere);.    }
273e0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
273f0 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51   (WHERE_ROWID_EQ
27400 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
27410 47 45 29 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  GE) ){.      zMs
27420 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
27430 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
27440 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  s USING INTEGER 
27450 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d  PRIMARY KEY", zM
27460 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  sg);..      if( 
27470 66 6c 61 67 73 26 57 48 45 52 45 5f 52 4f 57 49  flags&WHERE_ROWI
27480 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  D_EQ ){.        
27490 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
274a0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
274b0 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c   "%s (rowid=?)",
274c0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
274d0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57  lse if( (flags&W
274e0 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29  HERE_BOTH_LIMIT)
274f0 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  ==WHERE_BOTH_LIM
27500 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
27510 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
27520 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
27530 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20  %s (rowid>? AND 
27540 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
27550 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
27560 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54  ( flags&WHERE_BT
27570 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
27580 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
27590 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
275a0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
275b0 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
275c0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
275d0 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
275e0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
275f0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
27600 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
27610 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73   (rowid<?)", zMs
27620 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
27630 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
27640 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
27650 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  LE.    else if( 
27660 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  (flags & WHERE_V
27670 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
27680 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27690 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74  _index_info *pVt
276a0 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  abIdx = pLevel->
276b0 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b  plan.u.pVtabIdx;
276c0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
276d0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
276e0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54  , zMsg, "%s VIRT
276f0 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
27700 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20  %d:%s", zMsg,.  
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27720 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d  pVtabIdx->idxNum
27730 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53  , pVtabIdx->idxS
27740 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  tr);.    }.#endi
27750 66 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46  f.    if( wctrlF
27760 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45  lags&(WHERE_ORDE
27770 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52  RBY_MIN|WHERE_OR
27780 44 45 52 42 59 5f 4d 41 58 29 20 29 7b 0a 20 20  DERBY_MAX) ){.  
27790 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
277a0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
277b0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 29 3b 0a  _ORDERBY_MIN );.
277c0 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 31 3b 0a        nRow = 1;.
277d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
277e0 20 6e 52 6f 77 20 3d 20 28 73 71 6c 69 74 65 33   nRow = (sqlite3
277f0 5f 69 6e 74 36 34 29 70 4c 65 76 65 6c 2d 3e 70  _int64)pLevel->p
27800 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a  lan.nRow;.    }.
27810 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
27820 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
27830 4d 73 67 2c 20 22 25 73 20 28 7e 25 6c 6c 64 20  Msg, "%s (~%lld 
27840 72 6f 77 73 29 22 2c 20 7a 4d 73 67 2c 20 6e 52  rows)", zMsg, nR
27850 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ow);.    sqlite3
27860 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
27870 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69  _Explain, iId, i
27880 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d  Level, iFrom, zM
27890 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
278a0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
278b0 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65  efine explainOne
278c0 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a  Scan(u,v,w,x,y,z
278d0 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
278e0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
278f0 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  */.../*.** Gener
27900 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
27910 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
27920 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
27930 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
27940 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
27950 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
27960 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
27970 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
27980 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
27990 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
279a0 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
279b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
279c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
279d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
279e0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
279f0 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
27a00 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
27a10 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75   be coded */.  u
27a20 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
27a30 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
27a40 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
27a50 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
27a60 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d  eInt.h */.  Bitm
27a70 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
27a80 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73   /* Which tables
27a90 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61   are currently a
27aa0 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  vailable */.){. 
27ab0 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
27ac0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
27ad0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
27ae0 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
27af0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
27b00 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
27b10 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  e */.  int addrN
27b20 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  xt;         /* W
27b30 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20  here to jump to 
27b40 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
27b50 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a  e next IN case *
27b60 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c  /.  int omitTabl
27b70 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e;       /* True
27b80 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
27b90 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  ndex only */.  i
27ba0 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
27bb0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
27bc0 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
27bd0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
27be0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
27bf0 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65  *pLevel;  /* The
27c00 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20   where level to 
27c10 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
27c20 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
27c30 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
27c40 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
27c50 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
27c60 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
27c70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
27c80 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
27c90 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
27ca0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cc0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
27cd0 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  xt */.  Vdbe *v;
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
27d00 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
27d10 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
27d20 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
27d30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
27d40 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
27d50 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
27d60 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
27d70 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
27d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
27d90 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
27da0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
27db0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
27dc0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
27dd0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
27de0 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
27df0 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
27e00 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65  /.  int iRowidRe
27e10 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
27e20 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   Rowid is stored
27e30 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
27e40 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a  r, if not zero *
27e50 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65  /.  int iRelease
27e60 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Reg = 0;      /*
27e70 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74   Temp register t
27e80 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65  o free before re
27e90 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42 69 74  turning */.  Bit
27ea0 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61 64 79  mask newNotReady
27eb0 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
27ec0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70 50 61   value */..  pPa
27ed0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
27ee0 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
27ef0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
27f00 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a   = pWInfo->pWC;.
27f10 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
27f20 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20  fo->a[iLevel];. 
27f30 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49   pTabItem = &pWI
27f40 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
27f50 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
27f60 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  .  iCur = pTabIt
27f70 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62  em->iCursor;.  b
27f80 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70  Rev = (pLevel->p
27f90 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
27fa0 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b  ERE_REVERSE)!=0;
27fb0 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28  .  omitTable = (
27fc0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
27fd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
27fe0 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20  _ONLY)!=0 .     
27ff0 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
28000 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
28010 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20  CE_TABLE)==0;.  
28020 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
28030 28 76 2c 20 22 42 65 67 69 6e 20 4a 6f 69 6e 20  (v, "Begin Join 
28040 4c 6f 6f 70 20 25 64 22 2c 20 69 4c 65 76 65 6c  Loop %d", iLevel
28050 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ));..  /* Create
28060 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
28070 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
28080 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
28090 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
280a0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
280b0 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
280c0 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
280d0 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
280e0 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
280f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
28100 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
28110 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
28120 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
28130 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
28140 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
28150 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
28160 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
28170 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
28180 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
28190 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
281a0 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
281b0 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
281c0 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
281d0 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
281e0 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
281f0 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
28200 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
28210 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
28220 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
28230 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
28240 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
28250 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
28260 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
28270 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
28280 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
28290 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
282a0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
282b0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
282c0 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
282d0 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
282e0 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
282f0 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
28300 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
28310 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
28320 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
28330 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
28340 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
28350 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
28360 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
28370 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79  abItem[0].jointy
28380 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
28390 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
283a0 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50  iLeftJoin = ++pP
283b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
283c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
283d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
283e0 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
283f0 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
28400 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69  Comment((v, "ini
28410 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
28420 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
28430 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
28440 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63  case of a FROM c
28450 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69  lause subquery i
28460 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
28470 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
28480 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
28490 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
284a0 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d    int regYield =
284b0 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
284c0 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
284d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
284e0 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 49  P_Integer, pTabI
284f0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
28500 2d 31 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  -1, regYield);. 
28510 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
28520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28530 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
28540 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56  regYield);.    V
28550 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
28560 6e 65 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d 72  next row of co-r
28570 6f 75 74 69 6e 65 20 25 73 22 2c 20 70 54 61 62  outine %s", pTab
28580 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
28590 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e));.    sqlite3
285a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
285b0 5f 49 66 2c 20 72 65 67 59 69 65 6c 64 2b 31 2c  _If, regYield+1,
285c0 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70   addrBrk);.    p
285d0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47  Level->op = OP_G
285e0 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69  oto;.  }else..#i
285f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28600 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
28610 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70   if(  (pLevel->p
28620 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
28630 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
28640 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
28650 61 73 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c  ase 0:  The tabl
28660 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
28670 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
28680 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
28690 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
286a0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
286b0 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
286c0 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
286d0 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
286e0 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  Filter */.    in
286f0 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a  t addrNotFound;.
28700 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
28710 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78  x_info *pVtabIdx
28720 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
28730 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20  u.pVtabIdx;.    
28740 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
28750 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e  = pVtabIdx->nCon
28760 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 73 74 72  straint;.    str
28770 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
28780 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
28790 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20  ge *aUsage =.   
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 20 20 20 20 20                  
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74               pVt
287d0 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69  abIdx->aConstrai
287e0 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e  ntUsage;.    con
287f0 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  st struct sqlite
28800 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
28810 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20  nt *aConstraint 
28820 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28850 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e    pVtabIdx->aCon
28860 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73 71  straint;..    sq
28870 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
28880 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
28890 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  iReg = sqlite3Ge
288a0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
288b0 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  e, nConstraint+2
288c0 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f  );.    addrNotFo
288d0 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
288e0 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a  drBrk;.    for(j
288f0 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69  =1; j<=nConstrai
28900 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
28910 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73  for(k=0; k<nCons
28920 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20  traint; k++){.  
28930 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
28940 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a  [k].argvIndex==j
28950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
28960 74 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67  t iTarget = iReg
28970 2b 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  +j+1;.          
28980 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
28990 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69  aConstraint[k].i
289a0 54 65 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20 20  TermOffset];.   
289b0 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
289c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
289d0 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _IN ){.         
289e0 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54     codeEqualityT
289f0 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
28a00 6d 2c 20 70 4c 65 76 65 6c 2c 20 6b 2c 20 69 54  m, pLevel, k, iT
28a10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
28a20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
28a30 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
28a40 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  xt;.          }e
28a50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
28a60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28a70 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  (pParse, pTerm->
28a80 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
28a90 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  Target);.       
28aa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
28ab0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
28ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28ad0 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( k==nConstraint
28ae0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
28af0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28b00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
28b10 67 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69  ger, pVtabIdx->i
28b20 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20  dxNum, iReg);.  
28b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28b40 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
28b50 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b  r, j-1, iReg+1);
28b60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
28b70 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69  AddOp4(v, OP_VFi
28b80 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72  lter, iCur, addr
28b90 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 20  NotFound, iReg, 
28ba0 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72  pVtabIdx->idxStr
28bb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28bc0 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
28bd0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
28be0 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  tr ? P4_MPRINTF 
28bf0 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
28c00 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64    pVtabIdx->need
28c10 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
28c20 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
28c30 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
28c40 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 55  +){.      if( aU
28c50 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a  sage[j].omit ){.
28c60 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72          int iTer
28c70 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  m = aConstraint[
28c80 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  j].iTermOffset;.
28c90 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
28ca0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57 43  erm(pLevel, &pWC
28cb0 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20  ->a[iTerm]);.   
28cc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
28cd0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56  Level->op = OP_V
28ce0 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
28cf0 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
28d00 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
28d10 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
28d20 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
28d30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
28d40 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65  ange(pParse, iRe
28d50 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  g, nConstraint+2
28d60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
28d70 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
28d80 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  e, 1);.  }else.#
28d90 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
28da0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
28db0 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76  E */..  if( pLev
28dc0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
28dd0 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   & WHERE_ROWID_E
28de0 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  Q ){.    /* Case
28df0 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   1:  We can dire
28e00 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
28e10 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
28e20 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  g an.    **     
28e30 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
28e40 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
28e50 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
28e60 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20  .  Or.    **    
28e70 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
28e80 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
28e90 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
28ea0 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  IN (...)".    **
28eb0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
28ec0 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
28ed0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
28ee0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
28ef0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65  pParse);.    pTe
28f00 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
28f10 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
28f20 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
28f30 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  IN, 0);.    asse
28f40 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
28f50 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
28f60 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
28f70 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
28f80 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74  able==0 );.    t
28f90 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
28fa0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
28fb0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
28fc0 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
28fd0 2f 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67 20  /.    iRowidReg 
28fe0 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
28ff0 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
29000 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 69 52 65  , pLevel, 0, iRe
29010 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
29020 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
29030 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
29040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
29050 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
29060 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72   iRowidReg, addr
29070 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Nxt);.    sqlite
29080 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
29090 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
290a0 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77  r, addrNxt, iRow
290b0 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69  idReg);.    sqli
290c0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
290d0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
290e0 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29  e, iRowidReg, 1)
290f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
29100 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
29110 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
29120 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
29130 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
29140 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  k"));.    pLevel
29150 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
29160 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
29170 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
29180 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52   & WHERE_ROWID_R
29190 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ANGE ){.    /* C
291a0 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65 20  ase 2:  We have 
291b0 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
291c0 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
291d0 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
291e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
291f0 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
29200 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  p;.    int start
29210 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64  ;.    int memEnd
29220 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57  Value = 0;.    W
29230 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74  hereTerm *pStart
29240 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73  , *pEnd;..    as
29250 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
29260 3d 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74  =0 );.    pStart
29270 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
29280 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
29290 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
292a0 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d  , 0);.    pEnd =
292b0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
292c0 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
292d0 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
292e0 30 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  0);.    if( bRev
292f0 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   ){.      pTerm 
29300 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
29310 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
29320 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
29330 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  m;.    }.    if(
29340 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
29350 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
29360 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
29370 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65  pression that de
29380 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20  fines the start 
29390 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
293a0 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20  nt r1, rTemp;   
293b0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
293c0 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68  s for holding th
293d0 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79  e start boundary
293e0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
293f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
29400 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20  tant maps TK_xx 
29410 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65  codes into corre
29420 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20  sponding .      
29430 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e  ** seek opcodes.
29440 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20    It depends on 
29450 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  a particular ord
29460 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20  ering of TK_xx. 
29470 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
29480 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d  nst u8 aMoveOp[]
29490 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
294a0 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f  /* TK_GT */  OP_
294b0 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20  SeekGt,.        
294c0 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20     /* TK_LE */  
294d0 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20  OP_SeekLe,.     
294e0 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a        /* TK_LT *
294f0 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20  /  OP_SeekLt,.  
29500 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
29510 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a  E */  OP_SeekGe.
29520 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61        };.      a
29530 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b  ssert( TK_LE==TK
29540 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+1 );      /*
29550 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   Make sure the o
29560 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20  rdering.. */.   
29570 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
29580 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20  ==TK_GT+2 );    
29590 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65    /*  ... of the
295a0 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e   TK_xx values...
295b0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
295c0 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33  ( TK_GE==TK_GT+3
295d0 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
295e0 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f   is correcct. */
295f0 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
29600 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ( pStart->wtFlag
29610 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
29620 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
29630 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
29640 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70    pX = pStart->p
29650 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
29660 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
29670 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
29680 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  t->leftCursor==i
29690 43 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20  Cur );.      r1 
296a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
296b0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
296c0 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70  ->pRight, &rTemp
296d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
296e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d  VdbeAddOp3(v, aM
296f0 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f  oveOp[pX->op-TK_
29700 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  GT], iCur, addrB
29710 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  rk, r1);.      V
29720 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
29730 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  pk"));.      sql
29740 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
29750 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
29760 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  se, r1, 1);.    
29770 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
29780 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
29790 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69  rTemp);.      di
297a0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
297b0 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  , pStart);.    }
297c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
297d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
297e0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
297f0 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  : OP_Rewind, iCu
29800 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  r, addrBrk);.   
29810 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20   }.    if( pEnd 
29820 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
29830 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45  X;.      pX = pE
29840 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nd->pExpr;.     
29850 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
29860 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29870 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
29880 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20  ==iCur );.      
29890 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e  testcase( pEnd->
298a0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
298b0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
298c0 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
298d0 2f 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61  /.      memEndVa
298e0 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lue = ++pParse->
298f0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
29900 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
29910 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
29920 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20  memEndValue);.  
29930 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d      if( pX->op==
29940 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LT || pX->op=
29950 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20  =TK_GT ){.      
29960 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
29970 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b  ? OP_Le : OP_Ge;
29980 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29990 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
299a0 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50  Rev ? OP_Lt : OP
299b0 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _Gt;.      }.   
299c0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
299d0 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
299e0 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20    }.    start = 
299f0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
29a00 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70  ntAddr(v);.    p
29a10 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
29a20 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
29a30 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
29a40 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
29a50 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
29a60 61 72 74 3b 0a 20 20 20 20 69 66 28 20 70 53 74  art;.    if( pSt
29a70 61 72 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d  art==0 && pEnd==
29a80 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
29a90 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
29aa0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
29ab0 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
29ac0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
29ad0 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
29ae0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
29af0 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
29b00 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
29b10 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
29b20 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
29b30 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
29b40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29b50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
29b60 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  id, iCur, iRowid
29b70 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
29b80 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
29b90 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
29ba0 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
29bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29bc0 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
29bd0 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20  p, memEndValue, 
29be0 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52  addrBrk, iRowidR
29bf0 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
29c00 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
29c10 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
29c20 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55  ERIC | SQLITE_JU
29c30 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  MPIFNULL);.    }
29c40 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65  .  }else if( pLe
29c50 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
29c60 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
29c70 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f  N_RANGE|WHERE_CO
29c80 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20  LUMN_EQ) ){.    
29c90 2f 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63 61  /* Case 3: A sca
29ca0 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
29cb0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
29cc0 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
29cd0 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
29ce0 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
29cf0 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
29d00 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
29d10 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
29d20 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
29d30 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
29d40 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
29d50 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
29d60 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
29d70 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
29d80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
29d90 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
29da0 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
29db0 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
29dc0 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
29dd0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
29de0 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
29df0 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
29e00 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
29e10 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
29e20 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
29e30 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
29e40 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
29e50 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
29e60 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
29e70 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
29e80 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
29e90 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
29ea0 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
29eb0 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
29ec0 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
29ed0 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
29ee0 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
29ef0 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
29f00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
29f10 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
29f20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
29f30 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
29f40 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
29f50 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
29f60 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
29f70 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
29f80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
29f90 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
29fa0 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
29fb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
29fc0 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
29fd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
29fe0 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
29ff0 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
2a000 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
2a010 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2a020 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
2a030 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
2a040 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
2a050 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
2a060 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
2a070 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
2a080 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
2a090 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
2a0a0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
2a0b0 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
2a0c0 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
2a0d0 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
2a0e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
2a0f0 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
2a100 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
2a110 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
2a120 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
2a130 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
2a140 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
2a150 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
2a160 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
2a170 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
2a180 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
2a190 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
2a1a0 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
2a1b0 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73  ..    */  .    s
2a1c0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
2a1d0 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20  StartOp[] = {.  
2a1e0 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a      0,.      0,.
2a1f0 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c        OP_Rewind,
2a200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
2a210 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
2a220 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
2a230 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20  &&  !bRev) */.  
2a240 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20      OP_Last,    
2a250 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
2a260 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
2a270 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
2a280 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20     bRev) */.    
2a290 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20    OP_SeekGt,    
2a2a0 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74         /* 4: (st
2a2b0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
2a2c0 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
2a2d0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
2a2e0 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20  OP_SeekLt,      
2a2f0 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
2a300 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
2a310 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
2a320 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
2a330 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20  _SeekGe,        
2a340 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f     /* 6: (start_
2a350 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
2a360 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65   startEq && !bRe
2a370 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
2a380 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20  eekLe           
2a390 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f   /* 7: (start_co
2a3a0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
2a3b0 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
2a3c0 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73   */.    };.    s
2a3d0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
2a3e0 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
2a3f0 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20    OP_Noop,      
2a400 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65         /* 0: (!e
2a410 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20  nd_constraints) 
2a420 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
2a430 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
2a440 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
2a450 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a  ints && !bRev) *
2a460 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54  /.      OP_IdxLT
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a480 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
2a490 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a  nts && bRev) */.
2a4a0 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
2a4b0 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  Eq = pLevel->pla
2a4c0 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65  n.nEq;  /* Numbe
2a4d0 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65  r of == or IN te
2a4e0 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  rms */.    int i
2a4f0 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20  sMinQuery = 0;  
2a500 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2a510 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
2a520 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  ed SELECT min(x)
2a530 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  .. */.    int re
2a540 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
2a550 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
2a560 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
2a570 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
2a580 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b  s */.    int r1;
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
2a5b0 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68  gister */.    Wh
2a5c0 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53  ereTerm *pRangeS
2a5d0 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  tart = 0;  /* In
2a5e0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
2a5f0 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61  int at range sta
2a600 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  rt */.    WhereT
2a610 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d  erm *pRangeEnd =
2a620 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61   0;    /* Inequa
2a630 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
2a640 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a  at range end */.
2a650 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b      int startEq;
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a670 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
2a680 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c  e start uses ==,
2a690 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
2a6a0 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20   int endEq;     
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a6c0 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65   True if range e
2a6d0 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  nd uses ==, >= o
2a6e0 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
2a6f0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
2a700 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  s;       /* Star
2a710 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f  t of range is co
2a720 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20  nstrained */.   
2a730 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
2a740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2a750 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
2a760 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20  raint terms */. 
2a770 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a790 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
2a7a0 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f  will be using */
2a7b0 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72  .    int iIdxCur
2a7c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a7d0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
2a7e0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
2a7f0 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  ex */.    int nE
2a800 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20  xtraReg = 0;    
2a810 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a820 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
2a830 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  ers needed */.  
2a840 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
2a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a860 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70  * Instruction op
2a870 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  code */.    char
2a880 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20   *zStartAff;    
2a890 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
2a8a0 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f  nity for start o
2a8b0 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
2a8c0 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  nt */.    char *
2a8d0 7a 45 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20  zEndAff;        
2a8e0 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
2a8f0 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61  ty for end of ra
2a900 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  nge constraint *
2a910 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c  /..    pIdx = pL
2a920 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
2a930 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
2a940 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2a950 3b 0a 20 20 20 20 6b 20 3d 20 28 6e 45 71 3d 3d  ;.    k = (nEq==
2a960 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20  pIdx->nColumn ? 
2a970 2d 31 20 3a 20 70 49 64 78 2d 3e 61 69 43 6f 6c  -1 : pIdx->aiCol
2a980 75 6d 6e 5b 6e 45 71 5d 29 3b 0a 0a 20 20 20 20  umn[nEq]);..    
2a990 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20  /* If this loop 
2a9a0 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74  satisfies a sort
2a9b0 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79   order (pOrderBy
2a9c0 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a  ) request that .
2a9d0 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65      ** was passe
2a9e0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
2a9f0 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  on to implement 
2aa00 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
2aa10 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75   ..." .    ** qu
2aa20 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ery, then the ca
2aa30 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61  ller will only a
2aa40 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f  llow the loop to
2aa50 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20   run for.    ** 
2aa60 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69  a single iterati
2aa70 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  on. This means t
2aa80 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  hat the first ro
2aa90 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a  w returned.    *
2aaa0 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  * should not hav
2aab0 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73  e a NULL value s
2aac0 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66  tored in 'x'. If
2aad0 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20   column 'x' is. 
2aae0 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
2aaf0 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45  one after the nE
2ab00 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  q equality const
2ab10 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  raints in the in
2ab20 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73  dex,.    ** this
2ab30 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73   requires some s
2ab40 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
2ab50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ab60 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
2ab70 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d  E_ORDERBY_MIN)!=
2ab80 30 0a 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  0.     && (pLeve
2ab90 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26  l->plan.wsFlags&
2aba0 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 0a 20  WHERE_ORDERED). 
2abb0 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43      && (pIdx->nC
2abc0 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29  olumn>nEq).    )
2abd0 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  {.      /* asser
2abe0 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t( pOrderBy->nEx
2abf0 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  pr==1 ); */.    
2ac00 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72    /* assert( pOr
2ac10 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70  derBy->a[0].pExp
2ac20 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  r->iColumn==pIdx
2ac30 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20  ->aiColumn[nEq] 
2ac40 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69  ); */.      isMi
2ac50 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20  nQuery = 1;.    
2ac60 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
2ac70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
2ac80 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69  ind any inequali
2ac90 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ty constraint te
2aca0 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72  rms for the star
2acb0 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a  t and end .    *
2acc0 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  * of the range. 
2acd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ace0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2acf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
2ad00 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
2ad10 70 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64  pRangeEnd = find
2ad20 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
2ad30 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f  k, notReady, (WO
2ad40 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78  _LT|WO_LE), pIdx
2ad50 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  );.      nExtraR
2ad60 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  eg = 1;.    }.  
2ad70 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
2ad80 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2ad90 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
2ada0 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61 72        pRangeStar
2adb0 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  t = findTerm(pWC
2adc0 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
2add0 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  ady, (WO_GT|WO_G
2ade0 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  E), pIdx);.     
2adf0 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
2ae00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
2ae10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
2ae20 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
2ae30 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
2ae40 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
2ae50 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
2ae60 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
2ae70 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72   terms in an arr
2ae80 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
2ae90 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
2aea0 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20  at regBase..    
2aeb0 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  */.    regBase =
2aec0 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
2aed0 54 65 72 6d 73 28 0a 20 20 20 20 20 20 20 20 70  Terms(.        p
2aee0 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70  Parse, pLevel, p
2aef0 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45  WC, notReady, nE
2af00 78 74 72 61 52 65 67 2c 20 26 7a 53 74 61 72 74  xtraReg, &zStart
2af10 41 66 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a  Aff.    );.    z
2af20 45 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33  EndAff = sqlite3
2af30 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
2af40 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  >db, zStartAff);
2af50 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
2af60 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
2af70 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
2af80 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
2af90 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
2afa0 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
2afb0 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  ex, or.    ** a 
2afc0 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63  forward order sc
2afd0 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69  an on a descendi
2afe0 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63  ng index, interc
2aff0 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a  hange the .    *
2b000 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  * start and end 
2b010 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61  terms (pRangeSta
2b020 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64  rt and pRangeEnd
2b030 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
2b040 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f  ( (nEq<pIdx->nCo
2b050 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70  lumn && bRev==(p
2b060 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
2b070 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
2b080 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62  ASC)).     || (b
2b090 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f  Rev && pIdx->nCo
2b0a0 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29  lumn==nEq).    )
2b0b0 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65  {.      SWAP(Whe
2b0c0 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
2b0d0 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
2b0e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
2b0f0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
2b100 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61  art && pRangeSta
2b110 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
2b120 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_LE );.    tes
2b130 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
2b140 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
2b150 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
2b160 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_GE );.    test
2b170 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20  case( pRangeEnd 
2b180 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  && pRangeEnd->eO
2b190 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
2b1a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2b1b0 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52   pRangeEnd && pR
2b1c0 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
2b1d0 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
2b1e0 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
2b1f0 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
2b200 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
2b210 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
2b220 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
2b230 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
2b240 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
2b250 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
2b260 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
2b270 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
2b280 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
2b290 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
2b2a0 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
2b2b0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
2b2c0 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
2b2d0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
2b2e0 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
2b2f0 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
2b300 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
2b310 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
2b320 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
2b330 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2b340 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
2b350 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
2b360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
2b370 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
2b380 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
2b390 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2b3a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
2b3b0 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
2b3c0 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ht, regBase+nEq,
2b3d0 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
2b3e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74   }.      if( zSt
2b3f0 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20  artAff ){.      
2b400 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
2b410 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
2b420 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
2b430 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
2b440 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
2b450 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
2b460 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
2b470 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
2b480 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
2b490 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
2b4a0 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
2b4b0 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
2b4c0 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
2b4d0 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
2b4e0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
2b4f0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
2b500 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
2b510 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
2b520 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
2b530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2b540 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
2b550 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
2b560 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61  nge(pRight, zSta
2b570 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  rtAff[nEq]) ){. 
2b580 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
2b590 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
2b5a0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
2b5b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
2b5c0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
2b5d0 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
2b5e0 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d  se( pRangeStart-
2b5f0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2b600 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
2b610 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
2b620 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
2b630 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20   isMinQuery ){. 
2b640 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b650 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
2b660 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
2b670 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  q);.      nConst
2b680 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  raint++;.      s
2b690 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
2b6a0 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
2b6b0 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nts = 1;.    }. 
2b6c0 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
2b6d0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
2b6e0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
2b6f0 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  t, zStartAff);. 
2b700 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
2b710 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
2b720 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
2b730 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
2b740 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
2b750 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
2b760 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
2b770 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
2b780 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b  ( op==OP_Last );
2b790 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
2b7a0 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a  p==OP_SeekGt );.
2b7b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
2b7c0 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20  ==OP_SeekGe );. 
2b7d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
2b7e0 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20  =OP_SeekLe );.  
2b7f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
2b800 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20  OP_SeekLt );.   
2b810 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b820 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
2b830 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
2b840 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
2b850 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  int);..    /* Lo
2b860 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ad the value for
2b870 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
2b880 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68  constraint at th
2b890 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
2b8a0 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e   ** range (if an
2b8b0 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  y)..    */.    n
2b8c0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
2b8d0 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
2b8e0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
2b8f0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
2b900 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52  geEnd->pExpr->pR
2b910 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
2b920 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
2b930 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ve(pParse, regBa
2b940 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20  se+nEq, 1);.    
2b950 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2b960 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
2b970 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
2b980 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
2b990 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
2b9a0 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
2b9b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2b9c0 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
2b9d0 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
2b9e0 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
2b9f0 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Nxt);.      }.  
2ba00 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20      if( zEndAff 
2ba10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
2ba20 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2ba30 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45  inity(pRight, zE
2ba40 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c  ndAff[nEq])==SQL
2ba50 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20  ITE_AFF_NONE){. 
2ba60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63           /* Sinc
2ba70 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
2ba80 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
2ba90 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
2baa0 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  ersions.        
2bab0 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20    ** applied to 
2bac0 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65  the operands, se
2bad0 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
2bae0 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68  o apply to pRigh
2baf0 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20  t to .          
2bb00 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
2bb10 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  NE.  */.        
2bb20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d    zEndAff[nEq] =
2bb30 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
2bb40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bb50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2bb60 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
2bb70 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
2bb80 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29   zEndAff[nEq]) )
2bb90 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64  {.          zEnd
2bba0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
2bbb0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
2bbc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a      }.      }  .
2bbd0 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41        codeApplyA
2bbe0 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
2bbf0 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20  regBase, nEq+1, 
2bc00 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20  zEndAff);.      
2bc10 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
2bc20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2bc30 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
2bc40 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
2bc50 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
2bc60 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
2bc70 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
2bc80 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
2bc90 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
2bca0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
2bcb0 61 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66  arse->db, zEndAf
2bcc0 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20  f);..    /* Top 
2bcd0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79  of the loop body
2bce0 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   */.    pLevel->
2bcf0 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
2bd00 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2bd10 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
2bd20 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
2bd30 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e  r is past the en
2bd40 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  d of the range. 
2bd50 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64  */.    op = aEnd
2bd60 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c  Op[(pRangeEnd ||
2bd70 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65   nEq) * (1 + bRe
2bd80 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  v)];.    testcas
2bd90 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29  e( op==OP_Noop )
2bda0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2bdb0 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
2bdc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
2bdd0 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20  ==OP_IdxLT );.  
2bde0 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f    if( op!=OP_Noo
2bdf0 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
2be00 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2be10 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
2be20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
2be30 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
2be40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2be50 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64  eChangeP5(v, end
2be60 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a  Eq!=bRev ?1:0);.
2be70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2be80 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
2be90 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
2bea0 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  s, check that th
2beb0 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f  e value.    ** o
2bec0 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
2bed0 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71  mn that the ineq
2bee0 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73  uality contrains
2bef0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
2bf00 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a    ** If it is, j
2bf10 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
2bf20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
2bf30 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
2bf40 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
2bf50 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
2bf60 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2bf70 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2bf80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
2bf90 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65  _LIMIT );.    te
2bfa0 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
2bfb0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2bfc0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
2bfd0 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  ;.    if( (pLeve
2bfe0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2bff0 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
2c000 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
2c010 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IT))!=0 ){.     
2c020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c030 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2c040 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72   iIdxCur, nEq, r
2c050 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2c060 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2c070 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64  P_IsNull, r1, ad
2c080 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  drCont);.    }. 
2c090 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2c0a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2c0b0 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   r1);..    /* Se
2c0c0 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ek the table cur
2c0d0 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64  sor, if required
2c0e0 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54   */.    disableT
2c0f0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
2c100 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69  geStart);.    di
2c110 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
2c120 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20  , pRangeEnd);.  
2c130 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
2c140 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
2c150 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
2c160 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
2c170 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2c180 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c190 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
2c1a0 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
2c1b0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
2c1c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2c1d0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
2c1e0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
2c1f0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
2c200 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2c210 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
2c220 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
2c230 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
2c240 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
2c250 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75  ecord the instru
2c260 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65  ction used to te
2c270 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
2c280 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a  . Disable .    *
2c290 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
2c2a0 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64  erms made redund
2c2b0 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78  ant by the index
2c2c0 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20   range scan..   
2c2d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
2c2e0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2c2f0 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20   & WHERE_UNIQUE 
2c300 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
2c310 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
2c320 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65     }else if( bRe
2c330 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  v ){.      pLeve
2c340 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b  l->op = OP_Prev;
2c350 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c360 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
2c370 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  P_Next;.    }.  
2c380 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
2c390 49 64 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20  IdxCur;.    if( 
2c3a0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2c3b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 56  lags & WHERE_COV
2c3c0 45 52 5f 53 43 41 4e 20 29 7b 0a 20 20 20 20 20  ER_SCAN ){.     
2c3d0 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
2c3e0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
2c3f0 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
2c400 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c410 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
2c420 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  p5==0 );.    }. 
2c430 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
2c440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
2c450 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66  PTIMIZATION.  if
2c460 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
2c470 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
2c480 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f  ULTI_OR ){.    /
2c490 2a 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f  * Case 4:  Two o
2c4a0 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c  r more separatel
2c4b0 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  y indexed terms 
2c4c0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a  connected by OR.
2c4d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
2c4e0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
2c4f0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
2c500 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b  BLE t1(a,b,c,d);
2c510 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
2c520 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
2c530 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  a);.    **   CRE
2c540 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
2c550 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(b);.    **   
2c560 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
2c570 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a  ON t1(c);.    **
2c580 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
2c590 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
2c5a0 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28   a=5 OR b=7 OR (
2c5b0 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20  c=11 AND d=13). 
2c5c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
2c5d0 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  the example, the
2c5e0 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64  re are three ind
2c5f0 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
2c600 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20  cted by OR..    
2c610 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
2c620 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b  e loop looks lik
2c630 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
2c640 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
2c650 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
2c660 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
2c670 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
2c680 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20  reg 1.    **.   
2c690 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61   ** Then, for ea
2c6a0 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c  ch indexed term,
2c6b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20   the following. 
2c6c0 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
2c6d0 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65  .    ** RowSetTe
2c6e0 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74  st are such that
2c6f0 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
2c700 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
2c710 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a   inserted.    **
2c720 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
2c730 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
2c740 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  dy present, cont
2c750 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20  rol skips the.  
2c760 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64    ** Gosub opcod
2c770 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61  e and jumps stra
2c780 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65  ight to the code
2c790 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68   generated by Wh
2c7a0 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a  ereEnd()..    **
2c7b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
2c7c0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2c7d0 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20  (<term>).    ** 
2c7e0 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54           RowSetT
2c7f0 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
2c800 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f       # Insert ro
2c810 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a  wid into rowset.
2c820 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
2c830 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20  Gosub      2 A. 
2c840 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
2c850 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20  ite3WhereEnd(). 
2c860 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c     **.    ** Fol
2c870 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65  lowing the above
2c880 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e  , code to termin
2c890 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61  ate the loop. La
2c8a0 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65  bel A, the targe
2c8b0 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
2c8c0 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d  Gosub above, jum
2c8d0 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  ps to the instru
2c8e0 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65  ction right afte
2c8f0 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20  r the Goto..    
2c900 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
2c910 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
2c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
2c930 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
2c940 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
2c950 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20            Goto  
2c960 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20       B          
2c970 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70        # The loop
2c980 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20   is finished..  
2c990 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
2c9a0 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e    A: <loop body>
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9c0 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20   # Return data, 
2c9d0 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a  whatever..    **
2c9e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
2c9f0 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20   Return     2   
2ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a               # J
2ca10 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
2ca20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20  Gosub.    **.   
2ca30 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66   **       B: <af
2ca40 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20  ter the loop>.  
2ca50 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
2ca60 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
2ca70 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
2ca80 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
2ca90 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
2caa0 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
2cab0 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
2cac0 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
2cad0 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
2cae0 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
2caf0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
2cb00 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
2cb10 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20     /* Potential 
2cb20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28  covering index (
2cb30 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
2cb40 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50  int iCovCur = pP
2cb50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f  arse->nTab++;  /
2cb60 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f  * Cursor used fo
2cb70 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69  r index scans (i
2cb80 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69  f any) */..    i
2cb90 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  nt regReturn = +
2cba0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
2cbb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
2cbc0 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f  ster used with O
2cbd0 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69  P_Gosub */.    i
2cbe0 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30  nt regRowset = 0
2cbf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cc00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
2cc10 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20  ster for RowSet 
2cc20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
2cc30 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
2cc60 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  ter holding rowi
2cc70 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f  d */.    int iLo
2cc80 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  opBody = sqlite3
2cc90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2cca0 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c  ;  /* Start of l
2ccb0 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
2ccc0 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20  int iRetInit;   
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 20 20 2f 2a 20 41 64 64            /* Add
2ccf0 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72  ress of regRetur
2cd00 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e  n init */.    in
2cd10 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  t untestedTerms 
2cd20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2cd30 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e   /* Some terms n
2cd40 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65  ot completely te
2cd50 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sted */.    int 
2cd60 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
2cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cd80 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2cd90 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64  /.    Expr *pAnd
2cda0 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Expr = 0;       
2cdb0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22           /* An "
2cdc0 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78  .. AND (...)" ex
2cdd0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a  pression */.   .
2cde0 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76      pTerm = pLev
2cdf0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d  el->plan.u.pTerm
2ce00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
2ce10 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
2ce20 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
2ce30 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29  erator & WO_OR )
2ce40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
2ce50 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
2ce60 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
2ce70 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
2ce80 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2ce90 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ->wc;.    pLevel
2cea0 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
2ceb0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
2cec0 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
2ced0 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
2cee0 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f  ew SrcList in pO
2cef0 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
2cf00 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
2cf10 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
2cf20 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
2cf30 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
2cf40 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
2cf50 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
2cf60 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
2cf70 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
2cf80 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
2cf90 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
2cfa0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2cfb0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
2cfc0 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
2cfd0 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
2cfe0 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d000 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
2d010 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
2d020 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
2d030 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
2d040 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
2d050 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
2d060 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
2d070 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
2d080 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
2d090 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
2d0a0 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
2d0b0 41 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d  AllocRaw(pParse-
2d0c0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0e0 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29   sizeof(*pOrTab)
2d0f0 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65  + nNotReady*size
2d100 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29  of(pOrTab->a[0])
2d110 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
2d120 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
2d130 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20  notReady;.      
2d140 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d  pOrTab->nAlloc =
2d150 20 28 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79   (i16)(nNotReady
2d160 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72   + 1);.      pOr
2d170 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54  Tab->nSrc = pOrT
2d180 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20  ab->nAlloc;.    
2d190 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d    memcpy(pOrTab-
2d1a0 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69  >a, pTabItem, si
2d1b0 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29  zeof(*pTabItem))
2d1c0 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20  ;.      origSrc 
2d1d0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2d1e0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  st->a;.      for
2d1f0 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61  (k=1; k<=nNotRea
2d200 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  dy; k++){.      
2d210 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62    memcpy(&pOrTab
2d220 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63  ->a[k], &origSrc
2d230 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d  [pLevel[k].iFrom
2d240 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  ], sizeof(pOrTab
2d250 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[k]));.      
2d260 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2d270 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e     pOrTab = pWIn
2d280 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
2d290 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74    }..    /* Init
2d2a0 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65  ialize the rowse
2d2b0 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f  t register to co
2d2c0 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53  ntain NULL. An S
2d2d0 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20  QL NULL is .    
2d2e0 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
2d2f0 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74   an empty rowset
2d300 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2d310 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  Also initialize 
2d320 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e  regReturn to con
2d330 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73  tain the address
2d340 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74   of the instruct
2d350 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65  ion .    ** imme
2d360 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
2d370 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20  g the OP_Return 
2d380 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
2d390 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a   the loop. This.
2d3a0 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
2d3b0 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63  ed in a few obsc
2d3c0 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  ure LEFT JOIN ca
2d3d0 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f  ses where contro
2d3e0 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f  l jumps.    ** o
2d3f0 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ver the top of t
2d400 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  he loop into the
2d410 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20   body of it. In 
2d420 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20  this case the . 
2d430 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65     ** correct re
2d440 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65  sponse for the e
2d450 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20  nd-of-loop code 
2d460 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20  (the OP_Return) 
2d470 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61  is to .    ** fa
2d480 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
2d490 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2d4a0 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f  on, just as an O
2d4b0 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20  P_Next does if. 
2d4c0 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20     ** called on 
2d4d0 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
2d4e0 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a   cursor..    */.
2d4f0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2d500 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
2d510 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
2d520 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74  .      regRowset
2d530 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2d540 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
2d550 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
2d560 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
2d570 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2d580 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
2d590 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  wset);.    }.   
2d5a0 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69   iRetInit = sqli
2d5b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d5c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2d5d0 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20  regReturn);..   
2d5e0 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69   /* If the origi
2d5f0 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  nal WHERE clause
2d600 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72   is z of the for
2d610 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52  m:  (x1 OR x2 OR
2d620 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20   ...) AND y.    
2d630 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72  ** Then for ever
2d640 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75  y term xN, evalu
2d650 61 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78  ate as the subex
2d660 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44  pression: xN AND
2d670 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77   z.    ** That w
2d680 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74  ay, terms in y t
2d690 68 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64  hat are factored
2d6a0 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e   into the disjun
2d6b0 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ction will.    *
2d6c0 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62  * be picked up b
2d6d0 79 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  y the recursive 
2d6e0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2d6f0 57 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c  WhereBegin() bel
2d700 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ow..    **.    *
2d710 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68  * Actually, each
2d720 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
2d730 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22  s converted to "
2d740 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20  xN AND w" where 
2d750 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  w is.    ** the 
2d760 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65  "interesting" te
2d770 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73  rms of z - terms
2d780 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72   that did not or
2d790 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20  iginate in the. 
2d7a0 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e     ** ON or USIN
2d7b0 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  G clause of a LE
2d7c0 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72  FT JOIN, and ter
2d7d0 6d 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62  ms that are usab
2d7e0 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e  le as .    ** in
2d7f0 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  dices..    **.  
2d800 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69    ** This optimi
2d810 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79  zation also only
2d820 20 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20   applies if the 
2d830 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
2d840 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73  ) term.    ** is
2d850 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
2d860 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  n the ON clause 
2d870 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  of a LEFT JOIN..
2d880 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65      ** See ticke
2d890 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  t http://www.sql
2d8a0 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
2d8b0 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20  /f2369304e4.    
2d8c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e  */.    if( pWC->
2d8d0 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20  nTerm>1 ){.     
2d8e0 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20   int iTerm;.    
2d8f0 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69    for(iTerm=0; i
2d900 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  Term<pWC->nTerm;
2d910 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   iTerm++){.     
2d920 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
2d930 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70   pWC->a[iTerm].p
2d940 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
2d950 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2d960 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
2d970 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65  Join) ) continue
2d980 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
2d990 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c  C->a[iTerm].wtFl
2d9a0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
2d9b0 55 41 4c 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  UAL|TERM_ORINFO)
2d9c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d9d0 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61       if( (pWC->a
2d9e0 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f  [iTerm].eOperato
2d9f0 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29  r & WO_ALL)==0 )
2da00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2da10 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
2da20 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
2da30 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
2da40 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
2da50 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
2da60 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
2da70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b  AndExpr, pExpr);
2da80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2da90 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
2daa0 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20         pAndExpr 
2dab0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2dac0 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30  Parse, TK_AND, 0
2dad0 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a  , pAndExpr, 0);.
2dae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2daf0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2db00 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69  pOrWc->nTerm; ii
2db10 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
2db20 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20  Term *pOrTerm = 
2db30 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20  &pOrWc->a[ii];. 
2db40 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
2db50 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
2db60 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e  ur || (pOrTerm->
2db70 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
2db80 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
2db90 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75    WhereInfo *pSu
2dba0 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  bWInfo;         
2dbb0 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e   /* Info for sin
2dbc0 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e  gle OR-term scan
2dbd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
2dbe0 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54   *pOrExpr = pOrT
2dbf0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
2dc00 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
2dc10 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
2dc20 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50  erty(pOrExpr, EP
2dc30 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
2dc40 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
2dc50 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70  ->pLeft = pOrExp
2dc60 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  r;.          pOr
2dc70 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b  Expr = pAndExpr;
2dc80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2dc90 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
2dca0 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
2dcb0 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
2dcc0 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
2dcd0 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d       pSubWInfo =
2dce0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2dcf0 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61  in(pParse, pOrTa
2dd00 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30  b, pOrExpr, 0, 0
2dd10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2dd20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
2dd30 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20  OMIT_OPEN_CLOSE 
2dd40 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59  | WHERE_AND_ONLY
2dd50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
2dd60 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
2dd70 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57  _FORCE_TABLE | W
2dd80 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
2dd90 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20  LY, iCovCur);.  
2dda0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
2ddb0 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73  ubWInfo || pPars
2ddc0 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
2ddd0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2dde0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
2ddf0 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a  f( pSubWInfo ){.
2de00 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c            WhereL
2de10 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20  evel *pLvl;.    
2de20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65        explainOne
2de30 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Scan(.          
2de40 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54      pParse, pOrT
2de50 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e  ab, &pSubWInfo->
2de60 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c  a[0], iLevel, pL
2de70 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20  evel->iFrom, 0. 
2de80 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
2de90 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
2dea0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
2deb0 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
2dec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2ded0 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d  nt iSet = ((ii==
2dee0 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f  pOrWc->nTerm-1)?
2def0 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20  -1:ii);.        
2df00 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20      int r;.     
2df10 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74         r = sqlit
2df20 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
2df30 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
2df40 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20  Item->pTab, -1, 
2df50 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20  iCur, .         
2df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df80 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20  regRowid, 0);.  
2df90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2dfa0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
2dfb0 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c  , OP_RowSetTest,
2dfc0 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20   regRowset,.    
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2dff0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2e000 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65  ddr(v)+2, r, iSe
2e010 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
2e020 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e030 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2e040 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75  P_Gosub, regRetu
2e050 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  rn, iLoopBody);.
2e060 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2e070 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  e pSubWInfo->unt
2e080 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20  estedTerms flag 
2e090 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
2e0a0 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  OR term.        
2e0b0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f    ** contained o
2e0c0 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74  ne or more AND t
2e0d0 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65  erm from a notRe
2e0e0 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a  ady table.  The.
2e0f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72            ** ter
2e100 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52  ms from the notR
2e110 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64  eady table could
2e120 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61   not be tested a
2e130 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20  nd will.        
2e140 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20    ** need to be 
2e150 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20  tested later..  
2e160 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e170 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
2e180 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
2e190 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d  s ) untestedTerm
2e1a0 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  s = 1;..        
2e1b0 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    /* If all of t
2e1c0 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  he OR-connected 
2e1d0 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69  terms are optimi
2e1e0 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  zed using the sa
2e1f0 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  me.          ** 
2e200 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69  index, and the i
2e210 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75  ndex is opened u
2e220 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75  sing the same cu
2e230 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20  rsor number.    
2e240 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68        ** by each
2e250 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2e260 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64  WhereBegin() mad
2e270 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20  e by this loop, 
2e280 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20  it may.         
2e290 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20   ** be possible 
2e2a0 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64 65  to use that inde
2e2b0 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20  x as a covering 
2e2c0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
2e2d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
2e2e0 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
2e2f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2e300 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74  n() above result
2e310 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61  ed in a scan tha
2e320 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
2e330 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e  ses an index, an
2e340 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  d this is either
2e350 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f   the first OR-co
2e360 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20  nnected term.   
2e370 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
2e380 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78  sed or the index
2e390 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2e3a0 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c  that used by all
2e3b0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
2e3c0 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65      ** terms, se
2e3d0 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61  t pCov to the ca
2e3e0 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67  ndidate covering
2e3f0 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73   index. Otherwis
2e400 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  e, set .        
2e410 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c    ** pCov to NUL
2e420 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  L to indicate th
2e430 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20  at no candidate 
2e440 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77  covering index w
2e450 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ill .          *
2e460 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a  * be available..
2e470 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2e480 20 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70         pLvl = &p
2e490 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 3b 0a  SubWInfo->a[0];.
2e4a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2e4b0 4c 76 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  Lvl->plan.wsFlag
2e4c0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2e4d0 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  D)!=0.          
2e4e0 20 26 26 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e 2e   && (pLvl->plan.
2e4f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e500 54 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 0a 20  TEMP_INDEX)==0. 
2e510 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69            && (ii
2e520 3d 3d 30 20 7c 7c 20 70 4c 76 6c 2d 3e 70 6c 61  ==0 || pLvl->pla
2e530 6e 2e 75 2e 70 49 64 78 3d 3d 70 43 6f 76 29 0a  n.u.pIdx==pCov).
2e540 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2e550 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2e560 20 70 4c 76 6c 2d 3e 69 49 64 78 43 75 72 3d 3d   pLvl->iIdxCur==
2e570 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20  iCovCur );.     
2e580 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70 4c         pCov = pL
2e590 76 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  vl->plan.u.pIdx;
2e5a0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2e5b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
2e5c0 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ov = 0;.        
2e5d0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
2e5e0 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f  * Finish the loo
2e5f0 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
2e600 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
2e610 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
2e620 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
2e630 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53  lite3WhereEnd(pS
2e640 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  ubWInfo);.      
2e650 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2e660 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
2e670 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a  pCovidx = pCov;.
2e680 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70      if( pCov ) p
2e690 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
2e6a0 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66   iCovCur;.    if
2e6b0 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
2e6c0 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
2e6d0 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  eft = 0;.      s
2e6e0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2e6f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e  (pParse->db, pAn
2e700 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  dExpr);.    }.  
2e710 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2e720 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69  ngeP1(v, iRetIni
2e730 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
2e740 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
2e750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e760 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
2e770 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
2e780 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Brk);.    sqlite
2e790 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2e7a0 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  l(v, iLoopBody);
2e7b0 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ..    if( pWInfo
2e7c0 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c  ->nLevel>1 ) sql
2e7d0 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 70 50  ite3StackFree(pP
2e7e0 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62  arse->db, pOrTab
2e7f0 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65  );.    if( !unte
2e800 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61  stedTerms ) disa
2e810 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
2e820 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
2e830 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2e840 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
2e850 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
2e860 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68    /* Case 5:  Th
2e870 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
2e880 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
2e890 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
2e8a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
2e8b0 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
2e8c0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
2e8d0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
2e8e0 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
2e8f0 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
2e900 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
2e910 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
2e920 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
2e930 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
2e940 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
2e950 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
2e960 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
2e970 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65  le==0 );.    pLe
2e980 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b  vel->op = aStep[
2e990 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65  bRev];.    pLeve
2e9a0 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
2e9b0 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
2e9c0 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
2e9d0 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62  dOp2(v, aStart[b
2e9e0 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  Rev], iCur, addr
2e9f0 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Brk);.    pLevel
2ea00 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
2ea10 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
2ea20 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 65  N_STEP;.  }.  ne
2ea30 77 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52  wNotReady = notR
2ea40 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28  eady & ~getMask(
2ea50 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69  pWC->pMaskSet, i
2ea60 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65  Cur);..  /* Inse
2ea70 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
2ea80 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
2ea90 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
2eaa0 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20  completely.  ** 
2eab0 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
2eac0 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
2ead0 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  f tables..  **. 
2eae0 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
2eaf0 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35  ON-OF: R-49525-5
2eb00 30 39 33 35 20 54 65 72 6d 73 20 74 68 61 74 20  0935 Terms that 
2eb10 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73 66  cannot be satisf
2eb20 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ied through.  **
2eb30 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 69   the use of indi
2eb40 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74 73  ces become tests
2eb50 20 74 68 61 74 20 61 72 65 20 65 76 61 6c 75 61   that are evalua
2eb60 74 65 64 20 61 67 61 69 6e 73 74 20 65 61 63 68  ted against each
2eb70 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65   row of.  ** the
2eb80 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74 20   relevant input 
2eb90 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
2eba0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
2ebb0 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
2ebc0 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
2ebd0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b  ){.    Expr *pE;
2ebe0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
2ebf0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
2ec00 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
2ec10 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d  /* IMP: R-30575-
2ec20 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65 73  11662 */.    tes
2ec30 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
2ec40 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
2ec50 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ED );.    if( pT
2ec60 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
2ec70 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
2ec80 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
2ec90 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
2eca0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
2ecb0 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30   newNotReady)!=0
2ecc0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
2ecd0 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65  se( pWInfo->unte
2ece0 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20  stedTerms==0.   
2ecf0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2ed00 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2ed10 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
2ed20 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a  BLE_ONLY)!=0 );.
2ed30 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e        pWInfo->un
2ed40 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b  testedTerms = 1;
2ed50 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2ed60 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20  .    }.    pE = 
2ed70 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
2ed80 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
2ed90 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
2eda0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20  l->iLeftJoin && 
2edb0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2edc0 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
2edd0 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  ) ){.      conti
2ede0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nue;.    }.    s
2edf0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
2ee00 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64  e(pParse, pE, ad
2ee10 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
2ee20 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2ee30 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
2ee40 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
2ee50 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  }..  /* Insert c
2ee60 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20  ode to test for 
2ee70 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69  implied constrai
2ee80 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61  nts based on tra
2ee90 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f  nsitivity.  ** o
2eea0 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61  f the "==" opera
2eeb0 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  tor..  **.  ** E
2eec0 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57  xample: If the W
2eed0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
2eee0 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22  ains "t1.a=t2.b"
2eef0 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a   and "t2.b=123".
2ef00 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20    ** and we are 
2ef10 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f  coding the t1 lo
2ef20 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f  op and the t2 lo
2ef30 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63  op has not yet c
2ef40 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  oded,.  ** then 
2ef50 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68  we cannot use th
2ef60 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f  e "t1.a=t2.b" co
2ef70 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65  nstraint, but we
2ef80 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74   can code.  ** t
2ef90 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61  he implied "t1.a
2efa0 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74  =123" constraint
2efb0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
2efc0 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
2efd0 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
2efe0 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
2eff0 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 57   Expr *pE;.    W
2f000 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a  hereTerm *pAlt;.
2f010 20 20 20 20 45 78 70 72 20 73 45 71 3b 0a 20 20      Expr sEq;.  
2f020 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
2f030 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
2f040 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
2f050 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f060 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
2f070 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56  rator!=(WO_EQUIV
2f080 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e  |WO_EQ) ) contin
2f090 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
2f0a0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
2f0b0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
2f0c0 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
2f0d0 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
2f0e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2f0f0 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
2f100 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  oin) );.    asse
2f110 72 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  rt( (pTerm->prer
2f120 65 71 52 69 67 68 74 20 26 20 6e 65 77 4e 6f 74  eqRight & newNot
2f130 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20  Ready)!=0 );.   
2f140 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d   pAlt = findTerm
2f150 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72  (pWC, iCur, pTer
2f160 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c  m->u.leftColumn,
2f170 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
2f180 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20  |WO_IN, 0);.    
2f190 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f  if( pAlt==0 ) co
2f1a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2f1b0 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  pAlt->wtFlags & 
2f1c0 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  (TERM_CODED) ) c
2f1d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 56 64 62  ontinue;.    Vdb
2f1e0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
2f1f0 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69   "begin transiti
2f200 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29  ve constraint"))
2f210 3b 0a 20 20 20 20 73 45 71 20 3d 20 2a 70 41 6c  ;.    sEq = *pAl
2f220 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 73 45  t->pExpr;.    sE
2f230 71 2e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c  q.pLeft = pE->pL
2f240 65 66 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eft;.    sqlite3
2f250 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2f260 73 65 2c 20 26 73 45 71 2c 20 61 64 64 72 43 6f  se, &sEq, addrCo
2f270 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
2f280 46 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  FNULL);.  }..  /
2f290 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54  * For a LEFT OUT
2f2a0 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74  ER JOIN, generat
2f2b0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
2f2c0 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
2f2d0 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65   that.  ** at le
2f2e0 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
2f2f0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
2f300 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
2f310 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a  eft table.  .  *
2f320 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
2f330 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
2f340 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
2f350 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
2f360 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2f370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f380 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2f390 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 1, pLevel->
2f3a0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
2f3b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2f3c0 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49  "record LEFT JOI
2f3d0 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71  N hit"));.    sq
2f3e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2f3f0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2f400 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
2f410 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e  a, j=0; j<pWC->n
2f420 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
2f430 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ++){.      testc
2f440 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
2f450 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
2f460 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  AL );  /* IMP: R
2f470 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
2f480 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2f490 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
2f4a0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
2f4b0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
2f4c0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
2f4d0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
2f4e0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
2f4f0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
2f500 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65  ->prereqAll & ne
2f510 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  wNotReady)!=0 ){
2f520 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f530 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
2f540 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20  dTerms );.      
2f550 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2f560 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2f570 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
2f580 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2f590 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2f5a0 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
2f5b0 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
2f5c0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
2f5d0 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
2f5e0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
2f5f0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  D;.    }.  }.  s
2f600 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2f610 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
2f620 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65  leaseReg);..  re
2f630 74 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61 64 79  turn newNotReady
2f640 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
2f650 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
2f660 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2f670 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  g variable holds
2f680 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74   a text descript
2f690 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61  ion of query pla
2f6a0 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62  n generated.** b
2f6b0 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
2f6c0 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
2f6d0 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20  3WhereBegin().  
2f6e0 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65  Each call to Whe
2f6f0 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77  reBegin.** overw
2f700 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
2f710 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  us.  This inform
2f720 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
2f730 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a  r testing and.**
2f740 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
2f750 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f  */.char sqlite3_
2f760 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32  query_plan[BMS*2
2f770 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f  *40];  /* Text o
2f780 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74  f the join */.st
2f790 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20  atic int nQPlan 
2f7a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2f7b0 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73    /* Next free s
2f7c0 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c  low in _query_pl
2f7d0 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  an[] */..#endif 
2f7e0 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
2f7f0 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  /..#if defined(S
2f800 51 4c 49 54 45 5f 44 45 42 55 47 29 20 5c 0a 20  QLITE_DEBUG) \. 
2f810 20 20 20 26 26 20 28 64 65 66 69 6e 65 64 28 53     && (defined(S
2f820 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
2f830 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2f840 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
2f850 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
2f860 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2f870 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70   for debugging p
2f880 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
2f890 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
2f8a0 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20  Print(WhereLoop 
2f8b0 2a 70 2c 20 53 72 63 4c 69 73 74 20 2a 70 54 61  *p, SrcList *pTa
2f8c0 62 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e 62  bList){.  int nb
2f8d0 20 3d 20 32 2a 28 28 70 54 61 62 4c 69 73 74 2d   = 2*((pTabList-
2f8e0 3e 6e 53 72 63 2b 31 35 29 2f 31 36 29 3b 0a 20  >nSrc+15)/16);. 
2f8f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2f900 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 54  item *pItem = pT
2f910 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69  abList->a + p->i
2f920 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Tab;.  Table *pT
2f930 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
2f940 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
2f950 50 72 69 6e 74 66 28 22 25 32 64 2e 25 30 2a 6c  Printf("%2d.%0*l
2f960 6c 78 2e 25 30 2a 6c 6c 78 22 2c 0a 20 20 20 20  lx.%0*llx",.    
2f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f980 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d   p->iTab, nb, p-
2f990 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70  >maskSelf, nb, p
2f9a0 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c  ->prereq);.  sql
2f9b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2f9c0 22 20 25 38 73 22 2c 0a 20 20 20 20 20 20 20 20  " %8s",.        
2f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
2f9e0 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
2f9f0 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
2fa00 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
2fa10 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
2fa20 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2fa30 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  E)==0 ){.    if(
2fa40 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
2fa50 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ex ){.      sqli
2fa60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2fa70 2e 25 2d 31 32 73 20 25 32 64 22 2c 0a 20 20 20  .%-12s %2d",.   
2fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa90 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
2faa0 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  .pIndex->zName, 
2fab0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
2fac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fad0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2fae0 69 6e 74 66 28 22 25 31 36 73 22 2c 22 22 29 3b  intf("%16s","");
2faf0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2fb00 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
2fb10 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
2fb20 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
2fb30 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2fb40 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 29 22  tf("(%d,\"%s\")"
2fb50 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  , p->u.vtab.idxN
2fb60 75 6d 2c 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  um,p->u.vtab.idx
2fb70 53 74 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Str);.    }else{
2fb80 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
2fb90 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 29  e3_mprintf("(%d)
2fba0 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
2fbb0 4e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Num);.    }.    
2fbc0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2fbd0 74 66 28 22 20 25 2d 31 35 73 22 2c 20 7a 29 3b  tf(" %-15s", z);
2fbe0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2fbf0 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(z);.  }.  sqli
2fc00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2fc10 20 66 67 20 25 30 38 78 20 4e 20 25 32 64 22 2c   fg %08x N %2d",
2fc20 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
2fc30 6e 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65  nTerm);.  sqlite
2fc40 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
2fc50 6f 73 74 20 25 2e 34 67 2c 25 2e 34 67 2c 25 2e  ost %.4g,%.4g,%.
2fc60 34 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  4g\n",.         
2fc70 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
2fc80 72 65 72 65 71 2c 20 70 2d 3e 72 53 65 74 75 70  rereq, p->rSetup
2fc90 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
2fca0 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ut);.}.#endif../
2fcb0 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2fcc0 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20  internal memory 
2fcd0 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65 4c  used by a WhereL
2fce0 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  oop object.*/.st
2fcf0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
2fd00 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65 33  oopClear(sqlite3
2fd10 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
2fd20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 62  *p){.  sqlite3Db
2fd30 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 54 65 72  Free(db, p->aTer
2fd40 6d 29 3b 0a 20 20 70 2d 3e 61 54 65 72 6d 20 3d  m);.  p->aTerm =
2fd50 20 30 3b 0a 20 20 70 2d 3e 6e 54 65 72 6d 20 3d   0;.  p->nTerm =
2fd60 20 30 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73   0;.  if( (p->ws
2fd70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2fd80 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
2fd90 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  {.    if( p->u.v
2fda0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 20 73  tab.needFree ) s
2fdb0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75  qlite3_free(p->u
2fdc0 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
2fdd0 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65     p->u.vtab.nee
2fde0 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70  dFree = 0;.    p
2fdf0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
2fe00 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
2fe10 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
2fe20 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
2fe30 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2fe40 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
2fe50 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
2fe60 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
2fe70 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
2fe80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2fe90 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
2fea0 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
2feb0 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
2fec0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2fed0 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
2fee0 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
2fef0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
2ff00 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
2ff10 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2ff20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e   for(i=0; i<pWIn
2ff30 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  fo->nLevel; i++)
2ff40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2ff50 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66  index_info *pInf
2ff60 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d  o = pWInfo->a[i]
2ff70 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
2ff80 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
2ff90 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
2ffa0 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72   pInfo->needToFr
2ffb0 65 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64  eeIdxStr==0 || d
2ffc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2ffd0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ); */.        if
2ffe0 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  ( pInfo->needToF
2fff0 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20  reeIdxStr ){.   
30000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
30010 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74  ree(pInfo->idxSt
30020 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
30030 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
30040 72 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a  ree(db, pInfo);.
30050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
30060 28 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  ( pWInfo->a[i].p
30070 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
30080 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29  ERE_TEMP_INDEX )
30090 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  {.        Index 
300a0 2a 70 49 64 78 20 3d 20 70 57 49 6e 66 6f 2d 3e  *pIdx = pWInfo->
300b0 61 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  a[i].plan.u.pIdx
300c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
300d0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dx ){.          
300e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
300f0 2c 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 29  , pIdx->zColAff)
30100 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
30110 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
30120 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dx);.        }. 
30130 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
30140 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
30150 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a  r(pWInfo->pWC);.
30160 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66      while( pWInf
30170 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20  o->pLoops ){.   
30180 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20     WhereLoop *p 
30190 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  = pWInfo->pLoops
301a0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
301b0 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78  pLoops = p->pNex
301c0 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65  tLoop;.      whe
301d0 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
301e0 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   p);.    }.    s
301f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
30200 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a   pWInfo);.  }.}.
30210 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
30220 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65   replace a Where
30230 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67  Loop entry using
30240 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75   the template su
30250 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  pplied..**.** An
30260 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
30270 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20  oop entry might 
30280 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
30290 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  f the new templa
302a0 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20  te.** is better 
302b0 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65  and has fewer de
302c0 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20  pendencies.  Or 
302d0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c  the template wil
302e0 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  l be ignored.** 
302f0 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69  and no insert wi
30300 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65  ll occur if an e
30310 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
30320 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20  p is faster and 
30330 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70  has.** fewer dep
30340 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
30350 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74  he template.  Ot
30360 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68  herwise a new Wh
30370 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64  ereLoop is.** ad
30380 64 65 64 20 62 61 73 65 64 20 6e 6f 20 74 68 65  ded based no the
30390 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2f 0a 73 74   template..*/.st
303a0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
303b0 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f  opInsert(WhereLo
303c0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
303d0 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  der, WhereLoop *
303e0 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68  pTemplate){.  Wh
303f0 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76  ereLoop **ppPrev
30400 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d 20 30  , *p, *pNext = 0
30410 2c 20 2a 70 54 6f 46 72 65 65 20 3d 20 30 3b 0a  , *pToFree = 0;.
30420 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
30430 54 65 72 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Term = 0;.  sqli
30440 74 65 33 20 2a 64 62 20 3d 20 70 42 75 69 6c 64  te3 *db = pBuild
30450 65 72 2d 3e 64 62 3b 0a 20 20 57 68 65 72 65 49  er->db;.  WhereI
30460 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
30470 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
30480 0a 20 20 69 66 28 20 28 70 20 3d 20 70 42 75 69  .  if( (p = pBui
30490 6c 64 65 72 2d 3e 70 42 65 73 74 29 21 3d 30 20  lder->pBest)!=0 
304a0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61  ){.    if( p->ma
304b0 73 6b 53 65 6c 66 21 3d 30 20 29 7b 0a 20 20 20  skSelf!=0 ){.   
304c0 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 2b 70     if( p->rRun+p
304d0 2d 3e 72 53 65 74 75 70 20 3c 20 70 54 65 6d 70  ->rSetup < pTemp
304e0 6c 61 74 65 2d 3e 72 52 75 6e 2b 70 54 65 6d 70  late->rRun+pTemp
304f0 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 7b 0a  late->rSetup ){.
30500 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
30510 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
30520 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  }.      if( p->r
30530 52 75 6e 2b 70 2d 3e 72 53 65 74 75 70 20 3d 3d  Run+p->rSetup ==
30540 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
30550 2b 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  +pTemplate->rSet
30560 75 70 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e  up.       && p->
30570 70 72 65 72 65 71 20 3c 3d 20 70 54 65 6d 70 6c  prereq <= pTempl
30580 61 74 65 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20  ate->prereq ){. 
30590 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
305a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
305b0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 20 3d 20  .    }.    *p = 
305c0 2a 70 54 65 6d 70 6c 61 74 65 3b 0a 20 20 20 20  *pTemplate;.    
305d0 70 2d 3e 61 54 65 72 6d 20 3d 20 30 3b 0a 20 20  p->aTerm = 0;.  
305e0 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64    p->u.vtab.need
305f0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 72 65  Free = 0;.    re
30600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30610 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
30620 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
30630 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76   WhereLoop to ov
30640 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68 69 63  erwrite, or whic
30650 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69  h takes.  ** pri
30660 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65 6d 70  ority over pTemp
30670 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  late..  */.  for
30680 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d  (ppPrev=&pWInfo-
30690 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72  >pLoops, p=*ppPr
306a0 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70  ev; p; ppPrev=&p
306b0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a  ->pNextLoop, p=*
306c0 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28  ppPrev){.    if(
306d0 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
306e0 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74  ate->iTab ) cont
306f0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
30700 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
30710 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
30720 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26  ->prereq.     &&
30730 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d   p->rSetup<=pTem
30740 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20  plate->rSetup.  
30750 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70     && p->rRun<=p
30760 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20  Template->rRun. 
30770 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41     ){.      /* A
30780 6c 72 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61  lready holding a
30790 6e 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65  n equal or bette
307a0 72 20 57 68 65 72 65 4c 6f 6f 70 2e 0a 20 20 20  r WhereLoop..   
307b0 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 77 69 74     ** Return wit
307c0 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 6f 72  hout changing or
307d0 20 61 64 64 69 6e 67 20 61 6e 79 74 68 69 6e 67   adding anything
307e0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
307f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30800 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  }.    if( (p->pr
30810 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
30820 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
30830 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
30840 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3e 3d    && p->rSetup>=
30850 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
30860 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  p.     && p->rRu
30870 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
30880 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  un.    ){.      
30890 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20  /* Overwrite an 
308a0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
308b0 6f 70 20 77 69 74 68 20 61 20 62 65 74 74 65 72  op with a better
308c0 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e   one */.      pN
308d0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ext = p->pNextLo
308e0 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  op;.      whereL
308f0 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b  oopClear(db, p);
30900 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
30910 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
30920 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
30930 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
30940 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
30950 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
30960 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
30970 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
30980 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
30990 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
309a0 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
309b0 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
309c0 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  sert it..  */.  
309d0 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
309e0 70 20 3d 20 70 54 6f 46 72 65 65 20 3d 20 73 71  p = pToFree = sq
309f0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
30a00 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  (db, sizeof(Wher
30a10 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28  eLoop));.    if(
30a20 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
30a30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
30a40 0a 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65  .  if( pTemplate
30a50 2d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 70  ->nTerm ){.    p
30a60 61 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 44  aTerm = sqlite3D
30a70 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70  bMallocRaw(db, p
30a80 54 65 6d 70 6c 61 74 65 2d 3e 6e 54 65 72 6d 2a  Template->nTerm*
30a90 73 69 7a 65 6f 66 28 70 2d 3e 61 54 65 72 6d 5b  sizeof(p->aTerm[
30aa0 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 61  0]));.    if( pa
30ab0 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Term==0 ){.     
30ac0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
30ad0 62 2c 20 70 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, pToFree);.   
30ae0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30af0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
30b00 7d 0a 20 20 2a 70 20 3d 20 2a 70 54 65 6d 70 6c  }.  *p = *pTempl
30b10 61 74 65 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c  ate;.  p->pNextL
30b20 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a  oop = pNext;.  *
30b30 70 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 70 2d  ppPrev = p;.  p-
30b40 3e 61 54 65 72 6d 20 3d 20 70 61 54 65 72 6d 3b  >aTerm = paTerm;
30b50 0a 20 20 69 66 28 20 70 2d 3e 6e 54 65 72 6d 20  .  if( p->nTerm 
30b60 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ){.    memcpy(p-
30b70 3e 61 54 65 72 6d 2c 20 70 54 65 6d 70 6c 61 74  >aTerm, pTemplat
30b80 65 2d 3e 61 54 65 72 6d 2c 20 70 2d 3e 6e 54 65  e->aTerm, p->nTe
30b90 72 6d 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 54 65  rm*sizeof(p->aTe
30ba0 72 6d 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  rm[0]));.  }.  i
30bb0 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
30bc0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
30bd0 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  BLE)==0 ){.    i
30be0 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
30bf0 6e 64 65 78 20 26 26 20 70 2d 3e 75 2e 62 74 72  ndex && p->u.btr
30c00 65 65 2e 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  ee.pIndex->tnum=
30c10 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
30c20 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
30c30 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
30c40 7b 0a 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d  {.    pTemplate-
30c50 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
30c60 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
30c70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30c80 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73  ./*.** We have s
30c90 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42  o far matched pB
30ca0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
30cb0 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20  btree.nEq terms 
30cc0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e  of the index pIn
30cd0 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d  dex..** Try to m
30ce0 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a  atch one more..*
30cf0 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e  *.** If pProbe->
30d00 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tnum==0, that me
30d10 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20  ans pIndex is a 
30d20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20  fake index used 
30d30 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47  for the.** INTEG
30d40 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
30d50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
30d60 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
30d70 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ndex(.  WhereLoo
30d80 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
30d90 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  er,     /* The W
30da0 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79  hereLoop factory
30db0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
30dc0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
30dd0 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
30de0 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
30df0 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
30e00 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20  dex *pProbe,    
30e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e20 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72   An index on pSr
30e30 63 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 4d 75  c */.  int nInMu
30e40 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
30e50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30e60 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64   of iterations d
30e70 75 65 20 74 6f 20 49 4e 20 2a 2f 0a 29 7b 0a 20  ue to IN */.){. 
30e80 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
30e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ea0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
30eb0 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
30ec0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
30ed0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
30ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30ef0 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
30f00 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
30f10 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
30f20 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
30f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
30f40 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
30f50 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
30f60 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
30f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f80 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
30f90 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
30fa0 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
30fb0 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
30fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
30fd0 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
30fe0 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65  terms */.  Where
30ff0 4c 6f 6f 70 20 73 61 76 65 64 4c 6f 6f 70 3b 20  Loop savedLoop; 
31000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
31010 76 65 64 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  ved original con
31020 74 65 6e 74 20 6f 66 20 70 4e 65 77 5b 5d 20 2a  tent of pNew[] *
31030 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
31040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31050 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
31060 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  the column in th
31070 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
31080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
31090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
310a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
310b0 20 64 6f 75 62 6c 65 20 72 4c 6f 67 53 69 7a 65   double rLogSize
310c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
310d0 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
310e0 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 0a   table size */..
310f0 20 20 64 62 20 3d 20 70 42 75 69 6c 64 65 72 2d    db = pBuilder-
31100 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  >db;.  pNew = pB
31110 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
31120 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
31130 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
31140 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61  LITE_NOMEM;..  a
31150 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
31160 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
31170 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
31180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
31190 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
311a0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  robe->nColumn );
311b0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
311c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
311d0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_TOP_LIMIT)==0 
311e0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  );.  if( pNew->w
311f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
31200 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
31210 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57  opMask = WO_LT|W
31220 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_LE;.  }else if
31230 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
31240 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e  0 || (pSrc->join
31250 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
31260 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  =0 ){.    opMask
31270 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
31280 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
31290 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_LE;.  }else{
312a0 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
312b0 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e  _EQ|WO_IN|WO_ISN
312c0 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  ULL|WO_GT|WO_GE|
312d0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
312e0 0a 0a 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62  ..  iCol = pProb
312f0 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77  e->aiColumn[pNew
31300 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a  ->u.btree.nEq];.
31310 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53    pTerm = whereS
31320 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
31330 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53  Builder->pWC, pS
31340 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f  rc->iCursor, iCo
31350 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
31360 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73             opMas
31370 6b 2c 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 50 72  k, iCol>=0 ? pPr
31380 6f 62 65 20 3a 20 30 29 3b 0a 20 20 73 61 76 65  obe : 0);.  save
31390 64 4c 6f 6f 70 20 3d 20 2a 70 4e 65 77 3b 0a 20  dLoop = *pNew;. 
313a0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
313b0 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 72 4c 6f  (double)0;.  rLo
313c0 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 70  gSize = estLog(p
313d0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
313e0 30 5d 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d  0]);.  for(; rc=
313f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
31400 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20  erm!=0; pTerm = 
31410 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
31420 63 61 6e 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e  can)){.    int n
31430 49 6e 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77  In = 1;.    pNew
31440 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
31450 73 61 76 65 64 4c 6f 6f 70 2e 75 2e 62 74 72 65  savedLoop.u.btre
31460 65 2e 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  e.nEq;.    pNew-
31470 3e 6e 54 65 72 6d 20 3d 20 73 61 76 65 64 4c 6f  >nTerm = savedLo
31480 6f 70 2e 6e 54 65 72 6d 3b 0a 20 20 20 20 69 66  op.nTerm;.    if
31490 28 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 3e 3d 70  ( pNew->nTerm>=p
314a0 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72 6d 20  Builder->mxTerm 
314b0 29 20 62 72 65 61 6b 3b 20 2f 2a 20 52 65 70 65  ) break; /* Repe
314c0 61 74 65 64 20 63 6f 6c 75 6d 6e 20 69 6e 20 69  ated column in i
314d0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 70 4e 65 77  ndex */.    pNew
314e0 2d 3e 61 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 54  ->aTerm[pNew->nT
314f0 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm++] = pTerm;.
31500 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
31510 20 3d 20 28 73 61 76 65 64 4c 6f 6f 70 2e 70 72   = (savedLoop.pr
31520 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
31530 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
31540 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
31550 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
31560 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
31570 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
31580 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
31590 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
315a0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
315b0 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
315c0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
315d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
315e0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
315f0 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
31600 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 41  SELECT ...)":  A
31610 73 73 75 6d 65 20 74 68 65 20 53 45 4c 45 43 54  ssume the SELECT
31620 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
31630 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
31640 3d 20 32 35 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = 25;.      }els
31650 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
31660 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
31670 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
31680 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
31690 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65   /* "x IN (value
316a0 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a  , value, ...)" *
316b0 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
316c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
316d0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20  nExpr;.      }. 
316e0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
316f0 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20  ee.nEq++;.      
31700 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 64 6f  pNew->nOut = (do
31710 75 62 6c 65 29 70 50 72 6f 62 65 2d 3e 61 69 52  uble)pProbe->aiR
31720 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74  owEst[pNew->u.bt
31730 72 65 65 2e 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75  ree.nEq] * nInMu
31740 6c 20 2a 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c  l * nIn;.    }el
31750 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
31760 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
31770 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20  |WO_ISNULL) ){. 
31780 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
31790 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
317a0 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 70 4e 65  MN_EQ;.      pNe
317b0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
317c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
317d0 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 70 50 72  ut = (double)pPr
317e0 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e  obe->aiRowEst[pN
317f0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d  ew->u.btree.nEq]
31800 20 2a 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d   * nInMul;.    }
31810 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
31820 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
31830 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20  GT|WO_GE) ){.   
31840 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
31850 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
31860 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
31870 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e  _LIMIT;.      pN
31880 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
31890 4c 6f 6f 70 2e 6e 4f 75 74 2f 33 3b 0a 20 20 20  Loop.nOut/3;.   
318a0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
318b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
318c0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 7b 0a 20  O_LT|WO_LE) ){. 
318d0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
318e0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
318f0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
31900 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
31910 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
31920 65 64 4c 6f 6f 70 2e 6e 4f 75 74 2f 33 3b 0a 20  edLoop.nOut/3;. 
31930 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 72     }.    pNew->r
31940 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 2a 6e  Run = rLogSize*n
31950 49 6e 3b 20 20 2f 2a 20 43 6f 73 74 20 66 6f 72  In;  /* Cost for
31960 20 6e 49 6e 20 62 69 6e 61 72 79 20 73 65 61 72   nIn binary sear
31970 63 68 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ches */.    if( 
31980 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
31990 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
319a0 57 48 45 52 45 5f 49 50 4b 29 20 29 7b 0a 20 20  WHERE_IPK) ){.  
319b0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b      pNew->rRun +
319c0 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 20 20 2f  = pNew->nOut;  /
319d0 2a 20 55 6e 69 74 20 73 74 65 70 20 63 6f 73 74  * Unit step cost
319e0 20 74 6f 20 72 65 61 63 68 20 65 61 63 68 20 72   to reach each r
319f0 6f 77 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  ow */.    }else{
31a00 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72  .      /* Each r
31a10 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74  ow involves a st
31a20 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ep of the index,
31a30 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73   then a binary s
31a40 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a  earch of.      *
31a50 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  * the main table
31a60 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
31a70 72 52 75 6e 20 2b 3d 20 70 4e 65 77 2d 3e 6e 4f  rRun += pNew->nO
31a80 75 74 2a 28 31 20 2b 20 72 4c 6f 67 53 69 7a 65  ut*(1 + rLogSize
31a90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
31aa0 54 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74  TBD: Adjust nOut
31ab0 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20 53 54   and rRun for ST
31ac0 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75 65 73  AT3 range values
31ad0 20 2a 2f 0a 20 20 20 20 2f 2a 20 54 42 44 3a 20   */.    /* TBD: 
31ae0 41 64 6a 75 73 74 20 6e 4f 75 74 20 66 6f 72 20  Adjust nOut for 
31af0 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74  additional const
31b00 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 72 63  raints */.    rc
31b10 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
31b20 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
31b30 77 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65  w);.    if( (pNe
31b40 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
31b50 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
31b60 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
31b70 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62  .btree.nEq<pProb
31b80 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29  e->nColumn.    )
31b90 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
31ba0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
31bb0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
31bc0 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2a 6e 49  Probe, nInMul*nI
31bd0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
31be0 2a 70 4e 65 77 20 3d 20 73 61 76 65 64 4c 6f 6f  *pNew = savedLoo
31bf0 70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  p;.  return rc;.
31c00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
31c10 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
31c20 74 73 20 66 6f 72 20 74 68 65 20 69 54 61 62 2d  ts for the iTab-
31c30 74 68 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  th table of the 
31c40 6a 6f 69 6e 2e 20 20 54 68 61 74 0a 2a 2a 20 74  join.  That.** t
31c50 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
31c60 65 64 20 74 6f 20 62 65 20 61 20 62 2d 74 72 65  ed to be a b-tre
31c70 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76  e table, not a v
31c80 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
31c90 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
31ca0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20  eLoopAddBtree(. 
31cb0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
31cc0 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20  r *pBuilder, /* 
31cd0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
31ce0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
31cf0 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20  tmask mExtra    
31d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
31d10 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73  ra prerequesites
31d20 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20   for using this 
31d30 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e  table */.){.  In
31d40 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
31d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
31d60 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
31d70 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
31d80 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
31d90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
31da0 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
31db0 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
31dc0 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  key */.  tRowcnt
31dd0 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
31de0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
31df0 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  wEst[] value for
31e00 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
31e10 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e  /.  int aiColumn
31e20 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
31e30 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
31e40 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
31e50 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 74  Pk index */.  st
31e60 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
31e70 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65  m *pSrc;  /* The
31e80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72   FROM clause btr
31e90 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a  ee term to add *
31ea0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
31eb0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
31ec0 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
31ed0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
31ee0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
31ef0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
31f00 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
31f10 20 20 64 6f 75 62 6c 65 20 72 53 69 7a 65 3b 20    double rSize; 
31f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31f30 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
31f40 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
31f50 20 20 64 6f 75 62 6c 65 20 72 4c 6f 67 53 69 7a    double rLogSiz
31f60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
31f70 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
31f80 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
31f90 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
31fa0 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
31fb0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72  der->pNew;.  pSr
31fc0 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 54  c = pBuilder->pT
31fd0 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77  abList->a + pNew
31fe0 2d 3e 69 54 61 62 3b 0a 0a 20 20 69 66 28 20 70  ->iTab;..  if( p
31ff0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20  Src->pIndex ){. 
32000 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44     /* An INDEXED
32010 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69   BY clause speci
32020 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  fies a particula
32030 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  r index to use *
32040 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70  /.    pProbe = p
32050 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d  Src->pIndex;.  }
32060 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
32070 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44  re is no INDEXED
32080 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65   BY clause.  Cre
32090 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78  ate a fake Index
320a0 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c   object in local
320b0 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
320c0 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e   sPk to represen
320d0 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d  t the rowid prim
320e0 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20  ary key index.  
320f0 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  Make this.    **
32100 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20   fake index the 
32110 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e  first in a chain
32120 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   of Index object
32130 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68  s with all of th
32140 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  e real.    ** in
32150 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  dices to follow 
32160 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46  */.    Index *pF
32170 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
32180 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
32190 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  of real indices 
321a0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  on the table */.
321b0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c      memset(&sPk,
321c0 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78   0, sizeof(Index
321d0 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c  ));.    sPk.nCol
321e0 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  umn = 1;.    sPk
321f0 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43  .aiColumn = &aiC
32200 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b  olumnPk;.    sPk
32210 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52 6f  .aiRowEst = aiRo
32220 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
32230 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
32240 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
32250 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
32260 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  b;.    aiRowEstP
32270 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61  k[0] = pSrc->pTa
32280 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20  b->nRowEst;.    
32290 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20  aiRowEstPk[1] = 
322a0 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20  1;.    pFirst = 
322b0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
322c0 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  ex;.    if( pSrc
322d0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  ->notIndexed==0 
322e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
322f0 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20  real indices of 
32300 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e  the table are on
32310 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66  ly considered if
32320 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f   the.      ** NO
32330 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66  T INDEXED qualif
32340 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ier is omitted f
32350 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  rom the FROM cla
32360 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b  use */.      sPk
32370 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b  .pNext = pFirst;
32380 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62  .    }.    pProb
32390 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20  e = &sPk;.  }.  
323a0 72 53 69 7a 65 20 3d 20 28 64 6f 75 62 6c 65 29  rSize = (double)
323b0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  pSrc->pTab->nRow
323c0 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  Est;.  rLogSize 
323d0 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
323e0 0a 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  ..  /* Automatic
323f0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
32400 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  ( !pBuilder->pBe
32410 73 74 0a 20 20 20 26 26 20 28 70 42 75 69 6c 64  st.   && (pBuild
32420 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  er->pParse->db->
32430 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41  flags & SQLITE_A
32440 75 74 6f 49 6e 64 65 78 29 21 3d 30 20 0a 20 20  utoIndex)!=0 .  
32450 20 26 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f   && !pSrc->viaCo
32460 72 6f 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70  routine.   && !p
32470 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a  Src->notIndexed.
32480 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43     && !pSrc->isC
32490 6f 72 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20  orrelated.  ){. 
324a0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
324b0 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c  uto-index WhereL
324c0 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72  oops */.    Wher
324d0 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70  eClause *pWC = p
324e0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
324f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
32500 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  rm;.    WhereTer
32510 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  m *pWCEnd = pWC-
32520 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
32530 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
32540 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54  WC->a; rc==SQLIT
32550 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57  E_OK && pTerm<pW
32560 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
32570 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61        if( termCa
32580 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
32590 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20  m, pSrc, 0) ){. 
325a0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
325b0 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
325c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72        pNew->nTer
325d0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  m = 1;.        p
325e0 4e 65 77 2d 3e 61 54 65 72 6d 5b 30 5d 20 3d 20  New->aTerm[0] = 
325f0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  pTerm;.        p
32600 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 32 2a  New->rSetup = 2*
32610 72 4c 6f 67 53 69 7a 65 2a 70 53 72 63 2d 3e 70  rLogSize*pSrc->p
32620 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  Tab->nRowEst;.  
32630 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
32640 20 3d 20 28 64 6f 75 62 6c 65 29 31 30 3b 0a 20   = (double)10;. 
32650 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
32660 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 70  n = rLogSize + p
32670 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  New->nOut;.     
32680 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
32690 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   = WHERE_TEMP_IN
326a0 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  DEX;.        pNe
326b0 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
326c0 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  ra | pTerm->prer
326d0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
326e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
326f0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
32700 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
32710 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
32720 6e 73 65 72 74 20 61 20 66 75 6c 6c 20 74 61 62  nsert a full tab
32730 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 70 4e 65  le scan */.  pNe
32740 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
32750 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 54 65 72   0;.  pNew->nTer
32760 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  m = 0;.  pNew->r
32770 53 65 74 75 70 20 3d 20 28 64 6f 75 62 6c 65 29  Setup = (double)
32780 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  0;.  pNew->prere
32790 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 70 4e  q = mExtra;.  pN
327a0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
327b0 65 78 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ex = 0;.  pNew->
327c0 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  wsFlags = 0;.  p
327d0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
327e0 65 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  e;.  pNew->rRun 
327f0 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69  = rSize + rLogSi
32800 7a 65 3b 0a 20 20 2f 2a 20 54 42 44 3a 20 52 65  ze;.  /* TBD: Re
32810 64 75 63 65 20 6e 4f 75 74 20 75 73 69 6e 67 20  duce nOut using 
32820 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
32830 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
32840 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
32850 70 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  pNew);..  /* Loo
32860 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
32870 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  es.  */.  for(; 
32880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
32890 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
328a0 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a  pProbe->pNext){.
328b0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
328c0 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
328d0 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a  New->nTerm = 0;.
328e0 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
328f0 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  tnum<=0 ){.     
32900 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d   /* Integer prim
32910 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f  ary key index */
32920 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
32930 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b  lags = WHERE_IPK
32940 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
32950 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70     Bitmask m = p
32960 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  Src->colUsed;.  
32970 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
32980 20 66 6f 72 28 6a 3d 70 50 72 6f 62 65 2d 3e 6e   for(j=pProbe->n
32990 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
329a0 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  j--){.        in
329b0 74 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t x = pProbe->ai
329c0 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
329d0 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
329e0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d  {.          m &=
329f0 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ~(((Bitmask)1)<
32a00 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <x);.        }. 
32a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
32a20 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 6d 3d 3d  w->wsFlags = m==
32a30 30 20 3f 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  0 ? WHERE_IDX_ON
32a40 4c 59 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20  LY : 0;.    }.  
32a50 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
32a60 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b  pIndex = pProbe;
32a70 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ..    rc = where
32a80 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
32a90 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
32aa0 2c 20 70 50 72 6f 62 65 2c 20 31 29 3b 0a 0a 20  , pProbe, 1);.. 
32ab0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
32ac0 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
32ad0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
32ae0 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65  ly that one inde
32af0 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  x is.    ** cons
32b00 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  idered. */.    i
32b10 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
32b20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
32b30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32b40 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
32b50 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
32b60 20 74 68 65 20 69 54 61 62 2d 74 68 20 74 61 62   the iTab-th tab
32b70 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  le of the join. 
32b80 20 54 68 61 74 0a 2a 2a 20 74 61 62 6c 65 20 69   That.** table i
32b90 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
32ba0 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  be a virtual tab
32bb0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
32bc0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  t whereLoopAddVi
32bd0 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f  rtual(.  WhereLo
32be0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
32bf0 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63  der,  /* WHERE c
32c00 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
32c10 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
32c20 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
32c30 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65      /* Extra pre
32c40 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75  requesites for u
32c50 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20  sing this table 
32c60 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  */.){.  Parse *p
32c70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
32c80 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
32c90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
32ca0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
32cb0 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  C;            /*
32cc0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
32cd0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
32ce0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
32cf0 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
32d00 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
32d10 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65  earch */.  Table
32d20 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
32d30 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  3 *db;.  sqlite3
32d40 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
32d50 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
32d60 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
32d70 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
32d80 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
32d90 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
32da0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
32db0 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
32dc0 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
32dd0 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d  , j;.  int iTerm
32de0 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20  , mxTerm;.  int 
32df0 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20  seenIn = 0;     
32e00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
32e10 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   if an IN operat
32e20 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  or is seen */.  
32e30 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b  int seenVar = 0;
32e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32e50 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f  True if a non-co
32e60 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e  nstant constrain
32e70 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  t is seen */.  i
32e80 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20 20  nt iPhase;      
32e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
32ea0 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20  : const w/o IN, 
32eb0 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20  1: const, 2: no 
32ec0 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20  IN,  2: IN */.  
32ed0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
32ee0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
32ef0 54 45 5f 4f 4b 3b 0a 0a 20 20 70 50 61 72 73 65  TE_OK;..  pParse
32f00 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 50 61   = pBuilder->pPa
32f10 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
32f20 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20  se->db;.  pWC = 
32f30 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
32f40 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
32f50 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d  ->pNew;.  pSrc =
32f60 20 26 70 42 75 69 6c 64 65 72 2d 3e 70 54 61 62   &pBuilder->pTab
32f70 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54  List->a[pNew->iT
32f80 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  ab];.  pTab = pS
32f90 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 49 64 78  rc->pTab;.  pIdx
32fa0 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49  Info = allocateI
32fb0 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
32fc0 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69   pWC, pSrc, pBui
32fd0 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b  lder->pOrderBy);
32fe0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
32ff0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
33000 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77  TE_NOMEM;.  pNew
33010 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20  ->prereq = 0;.  
33020 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
33030 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
33040 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41  s = WHERE_VIRTUA
33050 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e  LTABLE;.  pNew->
33060 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65  nTerm = 0;.  pNe
33070 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
33080 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65  ee = 0;.  pUsage
33090 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
330a0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 0a  nstraintUsage;..
330b0 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20    for(iPhase=0; 
330c0 69 50 68 61 73 65 3c 3d 32 3b 20 69 50 68 61 73  iPhase<=2; iPhas
330d0 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  e++){.    if( !s
330e0 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65  eenIn && (iPhase
330f0 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
33100 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20  iPhase++;.      
33110 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62  if( iPhase>3 ) b
33120 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
33130 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20  if( !seenVar && 
33140 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b  iPhase>1 ) break
33150 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
33160 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
33170 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
33180 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
33190 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
331a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
331b0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
331c0 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
331d0 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  ++){.      j = p
331e0 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
331f0 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72  fset;.      pTer
33200 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
33210 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50        switch( iP
33220 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  hase ){.        
33230 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f  case 0:    /* Co
33240 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20  nstants without 
33250 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
33260 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
33270 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
33280 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
33290 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
332a0 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
332b0 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e            seenIn
332c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
332d0 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
332e0 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20  >prereqRight!=0 
332f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
33300 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20  eenVar = 1;.    
33310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33320 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
33330 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
33340 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
33360 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f      case 1:    /
33370 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
33380 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f   IN operators */
33390 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
333a0 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  t( seenIn );.   
333b0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
333c0 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
333d0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30  ->prereqRight==0
333e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
333f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
33400 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62   2:    /* Variab
33410 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a  les without IN *
33420 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
33430 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20  rt( seenVar );. 
33440 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
33450 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
33460 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
33470 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20  WO_IN)==0;.     
33480 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
33490 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f      default:   /
334a0 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
334b0 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   IN */.         
334c0 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72   assert( seenVar
334d0 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20   && seenIn );.  
334e0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
334f0 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
33500 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
33510 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
33520 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
33530 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
33540 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e  [0])*pIdxInfo->n
33550 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
33560 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
33570 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
33580 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
33590 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
335a0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
335b0 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
335c0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
335d0 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
335e0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
335f0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
33600 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
33610 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
33620 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29 20   /* ((double)2) 
33630 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54  In case of SQLIT
33640 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
33650 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20  POINT... */.    
33660 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
33670 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
33680 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75  _BIG_DBL / ((dou
33690 62 6c 65 29 32 29 3b 0a 20 20 20 20 72 63 20 3d  ble)2);.    rc =
336a0 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
336b0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
336c0 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  xInfo);.    if( 
336d0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c  rc ) goto whereL
336e0 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
336f0 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
33700 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
33710 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
33720 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
33730 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
33740 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
33750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
33760 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
33770 69 6e 74 3c 3d 70 42 75 69 6c 64 65 72 2d 3e 6d  int<=pBuilder->m
33780 78 54 65 72 6d 20 29 3b 0a 20 20 20 20 66 6f 72  xTerm );.    for
33790 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
337a0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
337b0 2b 2b 29 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b  ++) pNew->aTerm[
337c0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 6d 78 54 65  i] = 0;.    mxTe
337d0 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72  rm = -1;.    for
337e0 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
337f0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
33800 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
33810 0a 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72  .      if( (iTer
33820 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72  m = pUsage[i].ar
33830 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20  gvIndex - 1)>=0 
33840 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  ){.        j = p
33850 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
33860 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
33870 28 20 69 54 65 72 6d 3e 3d 70 49 64 78 49 6e 66  ( iTerm>=pIdxInf
33880 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  o->nConstraint. 
33890 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20          || j<0. 
338a0 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57          || j>=pW
338b0 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
338c0 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 54 65 72 6d    || pNew->aTerm
338d0 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20  [iTerm]!=0.     
338e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
338f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
33900 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  R;.          sql
33910 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
33920 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e  rse, "%s.xBestIn
33930 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f  dex() malfunctio
33940 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
33950 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
33960 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61   whereLoopAddVta
33970 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  b_exit;.        
33980 7d 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  }.        pTerm 
33990 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
339a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
339b0 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65  eq |= pTerm->pre
339c0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
339d0 20 20 70 4e 65 77 2d 3e 61 54 65 72 6d 5b 69 54    pNew->aTerm[iT
339e0 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  erm] = pTerm;.  
339f0 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
33a00 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20  mxTerm ) mxTerm 
33a10 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = iTerm;.       
33a20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
33a30 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
33a40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
33a50 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d  if( pUsage[i].om
33a60 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
33a70 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
33a80 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e  ttempt to use an
33a90 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69   IN constraint i
33aa0 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
33ab0 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
33ac0 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ** says that the
33ad0 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63   equivalent EQ c
33ae0 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
33af0 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74   be safely omitt
33b00 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
33b10 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65  ** If we do atte
33b20 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20  mpt to use such 
33b30 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f  a constraint, so
33b40 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65  me rows might be
33b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
33b60 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20  repeated in the 
33b70 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20  output. */.     
33b80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
33b90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33ba0 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c      /* A virtual
33bb0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63   table that is c
33bc0 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e  onstrained by an
33bd0 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e   IN clause may n
33be0 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ot.          ** 
33bf0 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45  consume the ORDE
33c00 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61  R BY clause beca
33c10 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65  use (1) the orde
33c20 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20  r of IN terms.  
33c30 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
33c40 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
33c50 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
33c60 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
33c70 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ms and.         
33c80 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65   ** (2) Multiple
33c90 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20   outputs from a 
33ca0 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20  single IN value 
33cb0 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20  will not merge. 
33cc0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65           ** toge
33cd0 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
33ce0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
33cf0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
33d00 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
33d10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
33d20 66 28 20 69 3e 3d 70 49 64 78 49 6e 66 6f 2d 3e  f( i>=pIdxInfo->
33d30 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20  nConstraint ){. 
33d40 20 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d       pNew->nTerm
33d50 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20   = mxTerm+1;.   
33d60 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
33d70 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66  idxNum = pIdxInf
33d80 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20  o->idxNum;.     
33d90 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
33da0 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66  edFree = pIdxInf
33db0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
33dc0 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49  Str;.      pIdxI
33dd0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
33de0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  dxStr = 0;.     
33df0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
33e00 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xStr = pIdxInfo-
33e10 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  >idxStr;.      p
33e20 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72  New->u.vtab.isOr
33e30 64 65 72 65 64 20 3d 20 28 75 38 29 28 70 49 64  dered = (u8)(pId
33e40 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21  xInfo->nOrderBy!
33e50 3d 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  =0);.      pNew-
33e60 3e 72 53 65 74 75 70 20 3d 20 28 64 6f 75 62 6c  >rSetup = (doubl
33e70 65 29 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  e)0;.      pNew-
33e80 3e 72 52 75 6e 20 3d 20 70 49 64 78 49 6e 66 6f  >rRun = pIdxInfo
33e90 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b  ->estimatedCost;
33ea0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
33eb0 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 35 3b 0a  t = (double)25;.
33ec0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49        whereLoopI
33ed0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
33ee0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
33ef0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
33f00 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
33f10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
33f20 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
33f30 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  tr);.        pNe
33f40 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
33f50 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ee = 0;.      }.
33f60 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65      }.  }  ..whe
33f70 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
33f80 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e  it:.  if( pIdxIn
33f90 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
33fa0 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
33fb0 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
33fc0 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
33fd0 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
33fe0 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  nfo);.  return r
33ff0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
34000 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65  WhereLoop entrie
34010 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74  s to handle OR t
34020 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b  erms.  This work
34030 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20  s for either.** 
34040 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75 61  btrees or virtua
34050 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
34060 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
34070 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70  pAddOr(WhereLoop
34080 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
34090 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  r, Bitmask mExtr
340a0 61 29 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  a){.  WhereClaus
340b0 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  e *pWC;.  WhereL
340c0 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65  oop *pNew;.  Whe
340d0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
340e0 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63  pWCEnd;.  int rc
340f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
34100 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72  int iCur;.  Wher
34110 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a  eClause tempWC;.
34120 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
34130 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20  er sSubBuild;.  
34140 57 68 65 72 65 4c 6f 6f 70 20 73 42 65 73 74 3b  WhereLoop sBest;
34150 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34160 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
34170 20 0a 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c   ..  pWC = pBuil
34180 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20  der->pWC;.  if( 
34190 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  pWC->wctrlFlags 
341a0 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59  & WHERE_AND_ONLY
341b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
341c0 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  _OK;.  pWCEnd = 
341d0 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
341e0 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  erm;.  pNew = pB
341f0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
34200 70 49 74 65 6d 20 3d 20 70 42 75 69 6c 64 65 72  pItem = pBuilder
34210 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
34220 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43  pNew->iTab;.  iC
34230 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
34240 73 6f 72 3b 0a 20 20 73 53 75 62 42 75 69 6c 64  sor;.  sSubBuild
34250 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
34260 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72  sSubBuild.pOrder
34270 42 79 20 3d 20 30 3b 0a 20 20 73 53 75 62 42 75  By = 0;.  sSubBu
34280 69 6c 64 2e 70 42 65 73 74 20 3d 20 26 73 42 65  ild.pBest = &sBe
34290 73 74 3b 0a 20 20 74 65 6d 70 57 43 2e 70 50 61  st;.  tempWC.pPa
342a0 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
342b0 65 3b 0a 20 20 74 65 6d 70 57 43 2e 70 4d 61 73  e;.  tempWC.pMas
342c0 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73  kSet = pWC->pMas
342d0 6b 53 65 74 3b 0a 20 20 74 65 6d 70 57 43 2e 70  kSet;.  tempWC.p
342e0 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 74  Outer = pWC;.  t
342f0 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
34300 44 3b 0a 20 20 74 65 6d 70 57 43 2e 77 63 74 72  D;.  tempWC.wctr
34310 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 74 65  lFlags = 0;.  te
34320 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
34330 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
34340 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
34350 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
34360 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
34370 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
34380 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
34390 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
343a0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
343b0 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
343c0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
343d0 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
343e0 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
343f0 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
34400 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
34410 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
34420 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
34430 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
34440 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
34450 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
34460 65 72 6d 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  erm;.      doubl
34470 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  e rTotal = 0;.  
34480 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 20      double nRow 
34490 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  = 0;.      Bitma
344a0 73 6b 20 70 72 65 72 65 71 20 3d 20 6d 45 78 74  sk prereq = mExt
344b0 72 61 3b 0a 0a 0a 20 20 20 20 20 20 66 6f 72 28  ra;...      for(
344c0 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61  pOrTerm=pOrWC->a
344d0 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45  ; pOrTerm<pOrWCE
344e0 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  nd; pOrTerm++){.
344f0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
34500 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
34510 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20   WO_AND)!=0 ){. 
34520 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
34530 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72  ld.pWC = &pOrTer
34540 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
34550 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
34560 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
34570 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
34580 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  {.          temp
34590 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
345a0 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
345b0 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57  ild.pWC = &tempW
345c0 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  C;.        }else
345d0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
345e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
345f0 20 20 20 20 20 20 20 20 73 42 65 73 74 2e 6d 61          sBest.ma
34600 73 6b 53 65 6c 66 20 3d 20 30 3b 0a 20 20 20 20  skSelf = 0;.    
34610 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
34620 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
34630 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
34640 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
34650 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c  tual(&sSubBuild,
34660 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   mExtra);.      
34670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34680 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
34690 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42  pAddBtree(&sSubB
346a0 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
346b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
346c0 20 69 66 28 20 73 42 65 73 74 2e 6d 61 73 6b 53   if( sBest.maskS
346d0 65 6c 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  elf==0 ) break;.
346e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
346f0 73 42 65 73 74 2e 72 53 65 74 75 70 3d 3d 28 64  sBest.rSetup==(d
34700 6f 75 62 6c 65 29 30 20 29 3b 0a 20 20 20 20 20  ouble)0 );.     
34710 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 42 65     rTotal += sBe
34720 73 74 2e 72 52 75 6e 3b 0a 20 20 20 20 20 20 20  st.rRun;.       
34730 20 6e 52 6f 77 20 2b 3d 20 73 42 65 73 74 2e 6e   nRow += sBest.n
34740 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 72 65  Out;.        pre
34750 72 65 71 20 7c 3d 20 73 42 65 73 74 2e 70 72 65  req |= sBest.pre
34760 72 65 71 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  req;.      }.   
34770 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d     pNew->nTerm =
34780 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   1;.      pNew->
34790 61 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  aTerm[0] = pTerm
347a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
347b0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55  Flags = WHERE_MU
347c0 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e  LTI_OR;.      pN
347d0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 28 64 6f  ew->rSetup = (do
347e0 75 62 6c 65 29 30 3b 0a 20 20 20 20 20 20 70 4e  uble)0;.      pN
347f0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 54 6f 74 61  ew->rRun = rTota
34800 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  l;.      pNew->n
34810 4f 75 74 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Out = nRow;.    
34820 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
34830 20 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 72   prereq;.      r
34840 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
34850 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
34860 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ew);.    }.  }. 
34870 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34880 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
34890 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
348a0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a  or all tables .*
348b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
348c0 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65  reLoopAddAll(Whe
348d0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
348e0 42 75 69 6c 64 65 72 29 7b 0a 20 20 42 69 74 6d  Builder){.  Bitm
348f0 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a  ask mExtra = 0;.
34900 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72    Bitmask mPrior
34910 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
34920 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
34930 62 4c 69 73 74 20 3d 20 70 42 75 69 6c 64 65 72  bList = pBuilder
34940 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
34950 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
34960 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72  m *pItem;.  Wher
34970 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70  eClause *pWC = p
34980 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
34990 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42  sqlite3 *db = pB
349a0 75 69 6c 64 65 72 2d 3e 64 62 3b 0a 20 20 69 6e  uilder->db;.  in
349b0 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 42 75  t nTabList = pBu
349c0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 6e  ilder->pWInfo->n
349d0 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20  Level;.  int rc 
349e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57  = SQLITE_OK;.  W
349f0 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
34a00 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
34a10 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
34a20 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66  e join, from lef
34a30 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20  t to right */.  
34a40 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 20 3d  pBuilder->pNew =
34a50 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
34a60 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
34a70 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
34a80 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  ));.  if( pNew==
34a90 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
34aa0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 42 75 69 6c  E_NOMEM;.  pBuil
34ab0 64 65 72 2d 3e 6d 78 54 65 72 6d 20 3d 20 70 57  der->mxTerm = pW
34ac0 43 2d 3e 6e 54 65 72 6d 2b 31 3b 0a 20 20 77 68  C->nTerm+1;.  wh
34ad0 69 6c 65 28 20 70 57 43 2d 3e 70 4f 75 74 65 72  ile( pWC->pOuter
34ae0 20 29 7b 0a 20 20 20 20 70 57 43 20 3d 20 70 57   ){.    pWC = pW
34af0 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 70  C->pOuter;.    p
34b00 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72 6d 20  Builder->mxTerm 
34b10 2b 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20  += pWC->nTerm;. 
34b20 20 7d 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c   }.  pWC = pBuil
34b30 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
34b40 2d 3e 61 54 65 72 6d 20 3d 20 73 71 6c 69 74 65  ->aTerm = sqlite
34b50 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
34b60 2c 70 42 75 69 6c 64 65 72 2d 3e 6d 78 54 65 72  ,pBuilder->mxTer
34b70 6d 2a 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 61  m*sizeof(pNew->a
34b80 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
34b90 20 70 4e 65 77 2d 3e 61 54 65 72 6d 3d 3d 30 20   pNew->aTerm==0 
34ba0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
34bb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
34bc0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41  to whereLoopAddA
34bd0 6c 6c 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 6f  ll_end;.  }.  fo
34be0 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
34bf0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61  pTabList->a; iTa
34c00 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62  b<nTabList; iTab
34c10 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
34c20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
34c30 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
34c40 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
34c50 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
34c60 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
34c70 3b 0a 20 20 20 20 69 66 28 20 28 70 49 74 65 6d  ;.    if( (pItem
34c80 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54  ->jointype & (JT
34c90 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
34ca0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78  !=0 ){.      mEx
34cb0 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20  tra = mPrior;.  
34cc0 20 20 7d 0a 20 20 20 20 69 66 28 20 49 73 56 69    }.    if( IsVi
34cd0 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
34ce0 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  b) ){.      rc =
34cf0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
34d00 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d  tual(pBuilder, m
34d10 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73  Extra);.    }els
34d20 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  e{.      rc = wh
34d30 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
34d40 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
34d50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
34d60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34d70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
34d80 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
34d90 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
34da0 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20     }.    mPrior 
34db0 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  |= pNew->maskSel
34dc0 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  f;.    if( rc ||
34dd0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
34de0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 77  d ) break;.  }.w
34df0 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 5f 65  hereLoopAddAll_e
34e00 6e 64 3a 0a 20 20 77 68 65 72 65 4c 6f 6f 70 44  nd:.  whereLoopD
34e10 65 6c 65 74 65 28 64 62 2c 20 70 42 75 69 6c 64  elete(db, pBuild
34e20 65 72 2d 3e 70 4e 65 77 29 3b 0a 20 20 70 42 75  er->pNew);.  pBu
34e30 69 6c 64 65 72 2d 3e 70 4e 65 77 20 3d 20 30 3b  ilder->pNew = 0;
34e40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34e50 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61  ./*.** Examine a
34e60 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 73 65   WherePath to se
34e70 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
34e80 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
34e90 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
34ea0 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
34eb0 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
34ec0 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 75  g a separate sou
34ed0 72 63 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  rce operation.  
34ee0 52 65 74 75 72 6e 20 31 0a 2a 2a 20 69 66 20 69  Return 1.** if i
34ef0 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69 66 20  t does and 0 if 
34f00 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20  it does not and 
34f10 2d 31 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  -1 if we cannot 
34f20 74 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tell..*/.static 
34f30 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 61 74  int wherePathSat
34f40 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20  isfiesOrderBy(. 
34f50 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
34f60 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48  fo,    /* The WH
34f70 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
34f80 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
34f90 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
34fa0 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20  rePath to check 
34fb0 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20  */.  int nLoop, 
34fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
34fd0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
34fe0 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  in pPath->aLoop[
34ff0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
35000 20 2a 70 4c 6f 6f 70 20 20 20 20 20 20 2f 2a 20   *pLoop      /* 
35010 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f  Add this WhereLo
35020 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  op to the end of
35030 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
35040 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4c 6f 6f  */.){.  if( pLoo
35050 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
35060 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
35070 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 4c  ){.    return nL
35080 6f 6f 70 3d 3d 30 20 26 26 20 70 4c 6f 6f 70 2d  oop==0 && pLoop-
35090 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
350a0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
350b0 2f 2a 20 54 42 44 3a 20 43 68 65 63 6b 20 74 6f  /* TBD: Check to
350c0 20 73 65 65 20 69 66 20 70 46 72 6f 6d 20 2b 20   see if pFrom + 
350d0 70 57 4c 6f 6f 70 20 73 61 74 69 73 66 69 65 73  pWLoop satisfies
350e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 20   the ORDER BY.. 
350f0 20 20 20 2a 2a 20 20 28 31 29 20 20 49 66 20 79     **  (1)  If y
35100 65 73 3a 20 20 20 73 65 74 20 69 73 4f 72 64 65  es:   set isOrde
35110 72 65 64 56 61 6c 69 64 20 61 6e 64 20 69 73 4f  redValid and isO
35120 72 64 65 72 65 64 20 74 6f 20 31 2e 0a 20 20 20  rdered to 1..   
35130 20 2a 2a 20 20 28 32 29 20 20 49 66 20 6e 6f 3a   **  (2)  If no:
35140 20 20 20 20 73 65 74 20 69 73 4f 72 64 65 72 65      set isOrdere
35150 64 56 61 6c 69 64 20 74 6f 20 31 20 61 6e 64 20  dValid to 1 and 
35160 69 73 4f 72 64 65 72 65 64 20 74 6f 20 30 2e 0a  isOrdered to 0..
35170 20 20 20 20 2a 2a 20 20 28 33 29 20 20 75 6e 6b      **  (3)  unk
35180 6e 6f 77 6e 3a 20 20 6e 6f 2d 6f 70 20 2a 2f 0a  nown:  no-op */.
35190 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
351a0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  }.}.../*.** Give
351b0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  n the list of Wh
351c0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
351d0 6f 6e 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  on pWInfo->pLoop
351e0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  s, this routine.
351f0 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ** attempts to f
35200 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
35210 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69  ost path that vi
35220 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c  sits each WhereL
35230 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68  oop.** once.  Th
35240 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20  is path is then 
35250 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
35260 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f  pWInfo->a[].pWLo
35270 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a  op fields..**.**
35280 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
35290 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
352a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20  SQLITE_NOMEM of 
352b0 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
352c0 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  ion.** error occ
352d0 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
352e0 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76  nt wherePathSolv
352f0 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  er(WhereInfo *pW
35300 49 6e 66 6f 29 7b 0a 20 20 63 6f 6e 73 74 20 69  Info){.  const i
35310 6e 74 20 6d 78 43 68 6f 69 63 65 20 3d 20 31 30  nt mxChoice = 10
35320 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75  ;  /* Maximum nu
35330 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e  mber of simultan
35340 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b  eous paths track
35350 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ed */.  int nLoo
35360 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
35370 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
35380 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  erms in the join
35390 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
353a0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
353b0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
353c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
353d0 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
353e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
353f0 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74  p counter over t
35400 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
35410 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  join */.  int ii
35420 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20  , jj;           
35430 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
35440 74 65 72 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  ters */.  double
35450 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
35460 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61      /* Cost of a
35470 20 70 61 74 68 20 2a 2f 0a 20 20 64 6f 75 62 6c   path */.  doubl
35480 65 20 6d 78 43 6f 73 74 3b 20 20 20 20 20 20 20  e mxCost;       
35490 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
354a0 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
354b0 20 70 61 74 68 73 20 2a 2f 0a 20 20 64 6f 75 62   paths */.  doub
354c0 6c 65 20 72 53 6f 72 74 43 6f 73 74 3b 20 20 20  le rSortCost;   
354d0 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f        /* Cost to
354e0 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20   do a sort */.  
354f0 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20  int nTo, nFrom; 
35500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
35510 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74  ber of valid ent
35520 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e  ries in aTo[] an
35530 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57  d aFrom[] */.  W
35540 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b  herePath *aFrom;
35550 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
35560 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74  nFrom paths at t
35570 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65  he previous leve
35580 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
35590 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *aTo;          
355a0 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74   /* The nTo best
355b0 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75   paths at the cu
355c0 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  rrent level */. 
355d0 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f   WherePath *pFro
355e0 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  m;         /* An
355f0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f   element of aFro
35600 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  m[] that we are 
35610 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
35620 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20  WherePath *pTo; 
35630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
35640 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d  element of aTo[]
35650 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
35660 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
35670 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
35680 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
35690 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
356a0 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72  bjects */.  Wher
356b0 65 4c 6f 6f 70 20 2a 70 4e 65 78 74 3b 20 20 20  eLoop *pNext;   
356c0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6c 6f        /* Next lo
356d0 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  op */.  WhereLoo
356e0 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20  p **pX;         
356f0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76    /* Used to div
35700 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20  y up the pSpace 
35710 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72  memory */.  char
35720 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
35730 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
35740 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ry memory used b
35750 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  y this routine *
35760 2f 0a 0a 20 20 64 62 20 3d 20 70 57 49 6e 66 6f  /..  db = pWInfo
35770 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
35780 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  nLoop = pWInfo->
35790 6e 4c 65 76 65 6c 3b 0a 20 20 61 73 73 65 72 74  nLevel;.  assert
357a0 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d  ( nLoop<=pWInfo-
357b0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  >pTabList->nSrc 
357c0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
357d0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
357e0 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61   space for aTo a
357f0 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69  nd aFrom */.  ii
35800 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65   = (sizeof(Where
35810 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65  Path)+sizeof(Whe
35820 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a  reLoop*)*nLoop)*
35830 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53  mxChoice*2;.  pS
35840 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62  pace = sqlite3Db
35850 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69  MallocRaw(db, ii
35860 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
35870 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
35880 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20  TE_NOMEM;.  aTo 
35890 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53  = (WherePath*)pS
358a0 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20  pace;.  aFrom = 
358b0 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20  aTo+mxChoice;.  
358c0 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c  memset(aFrom, 0,
358d0 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d   sizeof(aFrom[0]
358e0 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72  ));.  pX = (Wher
358f0 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d  eLoop**)(aFrom+m
35900 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28  xChoice);.  for(
35910 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ii=0, pFrom=aTo;
35920 20 69 69 3c 6d 78 43 68 6f 69 63 65 2a 32 3b 20   ii<mxChoice*2; 
35930 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70  ii++, pFrom++, p
35940 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20  X += nLoop){.   
35950 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20   pFrom->aLoop = 
35960 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  pX;.  }..  /* Se
35970 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69  ed the search wi
35980 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  th a single Wher
35990 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67  ePath containing
359a0 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73   zero WhereLoops
359b0 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
359c0 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  Row = (double)1;
359d0 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20  .  nFrom = 1;.. 
359e0 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74   /* Precompute t
359f0 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  he cost of sorti
35a00 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  ng the final res
35a10 75 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65 20  ult set, if the 
35a20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73  caller.  ** to s
35a30 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
35a40 28 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64  () was concerned
35a50 20 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a   about sorting *
35a60 2f 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  /.  rSortCost = 
35a70 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 69 66 28  (double)0;.  if(
35a80 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
35a90 79 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f  y==0 ){.    aFro
35aa0 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61  m[0].isOrderedVa
35ab0 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  lid = 1;.  }else
35ac0 7b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  {.    /* Compute
35ad0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 6e 20   an estimate on 
35ae0 74 68 65 20 63 6f 73 74 20 74 6f 20 73 6f 72 74  the cost to sort
35af0 20 74 68 65 20 65 6e 74 69 72 65 20 72 65 73 75   the entire resu
35b00 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 72 53  lt set */.    rS
35b10 6f 72 74 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c  ortCost = (doubl
35b20 65 29 31 3b 0a 20 20 20 20 66 6f 72 28 70 57 4c  e)1;.    for(pWL
35b30 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  oop=pWInfo->pLoo
35b40 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f  ps; pWLoop; pWLo
35b50 6f 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  op=pNext){.     
35b60 20 70 4e 65 78 74 20 3d 20 70 57 4c 6f 6f 70 2d   pNext = pWLoop-
35b70 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
35b80 20 20 72 43 6f 73 74 20 3d 20 70 57 4c 6f 6f 70    rCost = pWLoop
35b90 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 77 68  ->nOut;.      wh
35ba0 69 6c 65 28 20 70 4e 65 78 74 20 26 26 20 70 4e  ile( pNext && pN
35bb0 65 78 74 2d 3e 69 54 61 62 3d 3d 70 57 4c 6f 6f  ext->iTab==pWLoo
35bc0 70 2d 3e 69 54 61 62 20 29 7b 0a 20 20 20 20 20  p->iTab ){.     
35bd0 20 20 20 69 66 28 20 70 4e 65 78 74 2d 3e 6e 4f     if( pNext->nO
35be0 75 74 3c 72 43 6f 73 74 20 29 20 72 43 6f 73 74  ut<rCost ) rCost
35bf0 20 3d 20 70 4e 65 78 74 2d 3e 6e 4f 75 74 3b 0a   = pNext->nOut;.
35c00 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
35c10 70 4e 65 78 74 2d 3e 70 4e 65 78 74 4c 6f 6f 70  pNext->pNextLoop
35c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35c30 72 53 6f 72 74 43 6f 73 74 20 2a 3d 20 72 43 6f  rSortCost *= rCo
35c40 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 53  st;.    }.    rS
35c50 6f 72 74 43 6f 73 74 20 2a 3d 20 65 73 74 4c 6f  ortCost *= estLo
35c60 67 28 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20  g(rSortCost);.  
35c70 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
35c80 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
35c90 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
35ca0 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
35cb0 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
35cc0 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
35cd0 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
35ce0 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
35cf0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
35d00 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
35d10 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
35d20 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
35d30 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
35d40 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
35d50 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
35d60 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
35d70 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
35d80 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
35d90 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
35da0 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
35db0 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
35dc0 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
35dd0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
35de0 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77   Bitmask maskNew
35df0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f  ;.        u8 isO
35e00 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 70 46  rderedValid = pF
35e10 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  rom->isOrderedVa
35e20 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 75 38 20  lid;.        u8 
35e30 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f  isOrdered = pFro
35e40 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20  m->isOrdered;.  
35e50 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
35e60 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72  p->prereq & ~pFr
35e70 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
35e80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35e90 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
35ea0 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72  ->maskSelf & pFr
35eb0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
35ec0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35ed0 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
35ee0 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73  point, pWLoop is
35ef0 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
35f00 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70  be the next loop
35f10 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f  . .        ** Co
35f20 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a  mpute its cost *
35f30 2f 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74 20  /.        rCost 
35f40 3d 20 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70  = pWLoop->rSetup
35f50 20 2b 20 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 2a   + pWLoop->rRun*
35f60 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 46  pFrom->nRow + pF
35f70 72 6f 6d 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20  rom->rCost;.    
35f80 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
35f90 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
35fa0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
35fb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  ;.        if( !i
35fc0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b  sOrderedValid ){
35fd0 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
35fe0 68 28 20 77 68 65 72 65 50 61 74 68 53 61 74 69  h( wherePathSati
35ff0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
36000 6e 66 6f 2c 20 70 46 72 6f 6d 2c 20 69 4c 6f 6f  nfo, pFrom, iLoo
36010 70 2c 20 70 57 4c 6f 6f 70 29 20 29 7b 0a 20 20  p, pWLoop) ){.  
36020 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 31            case 1
36030 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f  :  /* Yes.  pFro
36040 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61  m+pWLoop does sa
36050 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
36060 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
36070 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
36080 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ered = 1;.      
36090 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
360a0 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  dValid = 1;.    
360b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
360c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
360d0 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46  e 0:  /* No.  pF
360e0 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20  rom+pWLoop will 
360f0 72 65 71 75 69 72 65 20 61 20 73 65 70 61 72 61  require a separa
36100 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20  te sort */.     
36110 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
36120 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
36130 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
36140 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
36150 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 2b 3d          rCost +=
36160 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 20 20   rSortCost;.    
36170 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
36180 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66  .            def
36190 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20  ault: /* Cannot 
361a0 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79 20 61  tell yet.  Try a
361b0 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65 78 74  gain on the next
361c0 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
361d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
361e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
361f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36200 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
36210 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c   if pWLoop shoul
36220 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  d be added to th
36230 65 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 20  e mxChoice best 
36240 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
36250 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d    for(jj=0, pTo=
36260 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b  aTo; jj<nTo; jj+
36270 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
36280 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61       if( pTo->ma
36290 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 20  skLoop==maskNew 
362a0 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  && pTo->isOrdere
362b0 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64 65 72 65  dValid==isOrdere
362c0 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  dValid ){.      
362d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
362e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
362f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
36300 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20  j>=nTo ){.      
36310 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
36320 68 6f 69 63 65 20 26 26 20 72 43 6f 73 74 3e 3d  hoice && rCost>=
36330 6d 78 43 6f 73 74 20 29 20 63 6f 6e 74 69 6e 75  mxCost ) continu
36340 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
36350 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b   nTo<mxChoice ){
36360 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
36370 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
36380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36390 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f        for(jj=nTo
363a0 2d 31 3b 20 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73  -1; aTo[jj].rCos
363b0 74 3c 6d 78 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b  t<mxCost; jj--){
363c0 20 61 73 73 65 72 74 28 6a 6a 3e 30 29 3b 20 7d   assert(jj>0); }
363d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
363e0 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
363f0 6f 5b 6a 6a 5d 3b 0a 20 20 20 20 20 20 20 20 7d  o[jj];.        }
36400 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
36410 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d  if( pTo->rCost<=
36420 72 43 6f 73 74 20 29 20 63 6f 6e 74 69 6e 75 65  rCost ) continue
36430 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36440 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73      /* pWLoop is
36450 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20   a winner.  Add 
36460 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  it to the set of
36470 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a   best so far */.
36480 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73          pTo->mas
36490 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d  kLoop = pFrom->m
364a0 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
364b0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
364c0 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20      pTo->nRow = 
364d0 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2a 20 70 57  pFrom->nRow * pW
364e0 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
364f0 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
36500 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
36510 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
36520 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65 64 56  lid = isOrderedV
36530 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 70 54  alid;.        pT
36540 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69  o->isOrdered = i
36550 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
36560 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
36570 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  oop, pFrom->aLoo
36580 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  p, sizeof(WhereL
36590 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20  oop*)*iLoop);.  
365a0 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70        pTo->aLoop
365b0 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70  [iLoop] = pWLoop
365c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  ;.        if( nT
365d0 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20  o>=mxChoice ){. 
365e0 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
365f0 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
36600 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a            for(jj
36610 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b  =1, pTo=&aTo[1];
36620 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a   jj<mxChoice; jj
36630 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
36640 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
36650 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 29 20  >rCost>mxCost ) 
36660 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
36670 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ost;.          }
36680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36690 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a   }.    }..#if 0.
366a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
366b0 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
366c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
366d0 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 72 6f 75 6e  rintf("---- roun
366e0 64 20 25 64 20 2d 2d 2d 2d 20 6e 54 6f 3d 25 64  d %d ---- nTo=%d
366f0 5c 6e 22 2c 20 69 4c 6f 6f 70 2c 20 6e 54 6f 29  \n", iLoop, nTo)
36700 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
36710 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 29 7b  ; ii<nTo; ii++){
36720 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36730 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 30 33  DebugPrintf("%03
36740 64 3a 20 20 63 6f 73 74 3d 25 67 20 20 6e 72 6f  d:  cost=%g  nro
36750 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20  w=%g\n",.       
36760 20 20 20 20 69 69 2c 20 61 54 6f 5b 69 69 5d 2e      ii, aTo[ii].
36770 72 43 6f 73 74 2c 20 61 54 6f 5b 69 69 5d 2e 6e  rCost, aTo[ii].n
36780 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  Row);.        fo
36790 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 3d 69 4c 6f 6f  r(jj=0; jj<=iLoo
367a0 70 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  p; jj++){.      
367b0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
367c0 6e 74 28 61 54 6f 5b 69 69 5d 2e 61 4c 6f 6f 70  nt(aTo[ii].aLoop
367d0 5b 6a 6a 5d 2c 20 70 57 49 6e 66 6f 2d 3e 70 54  [jj], pWInfo->pT
367e0 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  abList);.       
367f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
36800 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
36810 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f  Swap the roles o
36820 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20  f aFrom and aTo 
36830 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e  for the next gen
36840 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  eration */.    p
36850 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20  From = aTo;.    
36860 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20  aTo = aFrom;.   
36870 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a   aFrom = pFrom;.
36880 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b      nFrom = nTo;
36890 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 45 4d 50 4f  .  }..  /* TEMPO
368a0 52 41 52 59 20 2a 2f 0a 20 20 69 66 28 20 6e 46  RARY */.  if( nF
368b0 72 6f 6d 3d 3d 30 20 29 7b 20 73 71 6c 69 74 65  rom==0 ){ sqlite
368c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61  3DbFree(db, pSpa
368d0 63 65 29 3b 20 72 65 74 75 72 6e 20 53 51 4c 49  ce); return SQLI
368e0 54 45 5f 45 52 52 4f 52 3b 20 7d 0a 20 20 61 73  TE_ERROR; }.  as
368f0 73 65 72 74 28 20 6e 46 72 6f 6d 3e 30 20 29 3b  sert( nFrom>0 );
36900 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  .  .  /* Find th
36910 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
36920 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20  th.  pFrom will 
36930 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  be left pointing
36940 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f   to that path */
36950 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d  .  pFrom = aFrom
36960 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  ;.  for(ii=1; ii
36970 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20  <nFrom; ii++){. 
36980 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43     if( pFrom->rC
36990 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43  ost>aFrom[ii].rC
369a0 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61  ost ) pFrom = &a
369b0 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20  From[ii];.  }.  
369c0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
369d0 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b  nLevel==nLoop );
369e0 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c  .  /* Load the l
369f0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
36a00 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20  into pWInfo */. 
36a10 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
36a20 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
36a30 2b 2b 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  ++){.    pWInfo-
36a40 3e 61 5b 69 4c 6f 6f 70 5d 2e 70 57 4c 6f 6f 70  >a[iLoop].pWLoop
36a50 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b   = pFrom->aLoop[
36a60 69 4c 6f 6f 70 5d 3b 0a 20 20 7d 0a 20 20 69 66  iLoop];.  }.  if
36a70 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  ( pFrom->isOrder
36a80 65 64 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  ed ){.    pWInfo
36a90 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 57 49 6e 66  ->nOBSat = pWInf
36aa0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
36ab0 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72  pr;.  }..  /* Fr
36ac0 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d  ee temporary mem
36ad0 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73  ory and return s
36ae0 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  uccess */.  sqli
36af0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
36b00 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
36b10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
36b20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
36b30 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
36b40 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
36b50 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
36b60 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
36b70 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
36b80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
36b90 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
36ba0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
36bb0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
36bc0 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
36bd0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
36be0 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
36bf0 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
36c00 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
36c10 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
36c20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
36c30 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
36c40 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
36c50 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
36c60 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
36c70 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
36c80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
36c90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
36ca0 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
36cb0 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
36cc0 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
36cd0 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
36ce0 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
36cf0 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
36d00 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
36d10 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
36d20 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
36d30 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
36d40 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
36d50 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
36d60 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
36d70 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
36d80 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
36d90 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
36da0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
36db0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
36dc0 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
36dd0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
36de0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
36df0 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
36e00 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
36e10 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
36e20 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
36e30 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
36e40 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
36e50 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
36e60 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
36e70 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
36e80 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
36e90 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
36ea0 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
36eb0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
36ec0 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
36ed0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
36ee0 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
36ef0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
36f00 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
36f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
36f30 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
36f40 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
36f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f60 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
36f70 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
36f80 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
36f90 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
36fa0 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
36fb0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
36fc0 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
36fd0 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
36fe0 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
36ff0 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
37000 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
37010 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
37020 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
37030 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
37040 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
37050 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
37060 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
37070 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
37080 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
37090 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
370a0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
370b0 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
370c0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
370d0 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
370e0 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
370f0 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
37100 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
37110 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
37120 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
37130 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
37140 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
37150 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
37160 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
37170 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
37180 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
37190 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
371a0 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
371b0 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
371c0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
371d0 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
371e0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
371f0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
37200 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
37210 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
37220 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
37230 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
37240 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
37250 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
37260 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
37270 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
37280 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
37290 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
372a0 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
372b0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
372c0 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
372d0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
372e0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
372f0 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
37300 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
37310 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
37320 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
37330 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
37340 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
37350 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
37360 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
37370 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
37380 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
37390 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
373a0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
373b0 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
373c0 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
373d0 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
373e0 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
373f0 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
37400 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
37410 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
37420 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
37430 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
37440 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
37450 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
37460 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
37470 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
37480 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
37490 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
374a0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
374b0 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
374c0 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
374d0 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
374e0 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
374f0 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
37500 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
37510 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
37520 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
37530 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
37540 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
37550 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
37560 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
37570 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
37580 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
37590 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
375a0 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
375b0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
375c0 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
375d0 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
375e0 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
375f0 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
37600 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
37610 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
37620 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
37630 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
37640 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
37650 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
37660 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
37670 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
37680 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
37690 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
376a0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
376b0 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
376c0 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
376d0 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
376e0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
376f0 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
37700 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
37710 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
37720 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
37730 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
37740 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
37750 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
37760 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
37770 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
37780 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
37790 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
377a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
377b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
377c0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
377d0 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65  ent,.** if there
377e0 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
377f0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
37800 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
37810 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
37820 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
37830 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
37840 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
37850 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55  n pOrderBy is NU
37860 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
37870 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
37880 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61  d so that the na
37890 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64  tural output ord
378a0 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  er of the table.
378b0 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65  ** scan is corre
378c0 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  ct for the ORDER
378d0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
378e0 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20 75   that index is u
378f0 73 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  sed and.** the r
37900 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66  eturned WhereInf
37910 6f 2e 6e 4f 42 53 61 74 20 66 69 65 6c 64 20 69  o.nOBSat field i
37920 73 20 73 65 74 20 74 6f 20 70 4f 72 64 65 72 42  s set to pOrderB
37930 79 2d 3e 6e 45 78 70 72 2e 20 20 54 68 69 73 0a  y->nExpr.  This.
37940 2a 2a 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** is an optimiz
37950 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65  ation that preve
37960 6e 74 73 20 61 6e 20 75 6e 6e 65 63 65 73 73 61  nts an unnecessa
37970 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72  ry sort of the r
37980 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 69 66 20  esult set.** if 
37990 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72  an index appropr
379a0 69 61 74 65 20 66 6f 72 20 74 68 65 20 4f 52 44  iate for the ORD
379b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72  ER BY clause alr
379c0 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  eady exists..**.
379d0 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20  ** If the where 
379e0 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e  clause loops can
379f0 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20  not be arranged 
37a00 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
37a10 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74  orrect.** output
37a20 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 57 68 65   order, then Whe
37a30 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74 20 69 73  reInfo.nOBSat is
37a40 20 30 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f   0..*/.WhereInfo
37a50 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
37a60 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
37a70 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
37a80 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
37a90 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
37aa0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
37ab0 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
37ac0 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
37ad0 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
37ae0 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
37af0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
37b00 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
37b10 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
37b20 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
37b30 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
37b40 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
37b50 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20 73  tinct,  /* The s
37b60 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72 20 44  elect-list for D
37b70 49 53 54 49 4e 43 54 20 71 75 65 72 69 65 73 20  ISTINCT queries 
37b80 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75  - or NULL */.  u
37b90 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
37ba0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
37bb0 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
37bc0 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
37bd0 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
37be0 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20   iIdxCur        
37bf0 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
37c00 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
37c10 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
37c20 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
37c30 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
37c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37c50 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
37c60 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
37c70 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
37c80 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
37c90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
37ca0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
37cb0 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
37cc0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
37cd0 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
37ce0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
37cf0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
37d00 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
37d10 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
37d20 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
37d30 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
37d40 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
37d50 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
37d60 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
37d70 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
37d80 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
37d90 64 20 2a 2f 0a 20 20 57 68 65 72 65 42 65 73 74  d */.  WhereBest
37da0 49 64 78 20 73 57 42 49 3b 20 20 20 20 20 20 20  Idx sWBI;       
37db0 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
37dc0 73 65 61 72 63 68 20 63 6f 6e 74 65 78 74 20 2a  search context *
37dd0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
37de0 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f  lder sWLB;     /
37df0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
37e00 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65  builder */.  Whe
37e10 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
37e20 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65  Set;    /* The e
37e30 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
37e40 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  et */.  WhereLev
37e50 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20  el *pLevel;     
37e60 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
37e70 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e  evel in pWInfo->
37e80 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  a[] */.  int iFr
37e90 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  om;             
37ea0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
37eb0 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  sed FROM clause 
37ec0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
37ed0 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20   andFlags;      
37ee0 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65          /* AND-e
37ef0 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
37f00 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77 74   all pWC->a[].wt
37f10 46 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69  Flags */.  int i
37f20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
37f30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
37f40 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  unter */.  sqlit
37f50 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
37f60 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
37f70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
37f80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
37f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37fa0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
37fb0 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69  .  /* Variable i
37fc0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
37fd0 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 42 49 2c  .  memset(&sWBI,
37fe0 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 42 49 29   0, sizeof(sWBI)
37ff0 29 3b 0a 20 20 73 57 42 49 2e 70 50 61 72 73 65  );.  sWBI.pParse
38000 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 6d 65 6d   = pParse;.  mem
38010 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69  set(&sWLB, 0, si
38020 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20 73  zeof(sWLB));.  s
38030 57 4c 42 2e 70 50 61 72 73 65 20 3d 20 70 50 61  WLB.pParse = pPa
38040 72 73 65 3b 0a 20 20 73 57 4c 42 2e 64 62 20 3d  rse;.  sWLB.db =
38050 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
38060 57 4c 42 2e 70 54 61 62 4c 69 73 74 20 3d 20 70  WLB.pTabList = p
38070 54 61 62 4c 69 73 74 3b 0a 20 20 73 57 4c 42 2e  TabList;.  sWLB.
38080 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
38090 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  rBy;..  /* The n
380a0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
380b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
380c0 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
380d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
380e0 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
380f0 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
38100 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
38110 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
38120 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
38130 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
38140 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
38150 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
38160 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
38170 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
38180 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
38190 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
381a0 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
381b0 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
381c0 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
381d0 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
381e0 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
381f0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
38200 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
38210 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64  , then we should
38220 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72  .  ** only gener
38230 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
38240 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20   first table in 
38250 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73  pTabList and ass
38260 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e  ume that.  ** an
38270 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  y cursors associ
38280 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71  ated with subseq
38290 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20  uent tables are 
382a0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
382b0 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d   */.  nTabList =
382c0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
382d0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ON