/ Hex Artifact Content
Login

Artifact e029cd3fe9f2fcc857cf19d05b352b2359638271:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 20 64 65  bugPrintf X.# de
0460: 66 69 6e 65 20 57 48 45 52 45 54 52 41 43 45 5f  fine WHERETRACE_
0470: 45 4e 41 42 4c 45 44 20 31 0a 23 65 6c 73 65 0a  ENABLED 1.#else.
0480: 23 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52  # define WHERETR
0490: 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  ACE(X).#endif../
04a0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
04b0: 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce.*/.typedef s
04c0: 74 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73  truct WhereClaus
04d0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74  e WhereClause;.t
04e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04f0: 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65  ereMaskSet Where
0500: 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66  MaskSet;.typedef
0510: 20 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49   struct WhereOrI
0520: 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b  nfo WhereOrInfo;
0530: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0540: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65  WhereAndInfo Whe
0550: 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64  reAndInfo;.typed
0560: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4c  ef struct WhereL
0570: 65 76 65 6c 20 57 68 65 72 65 4c 65 76 65 6c 3b  evel WhereLevel;
0580: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0590: 57 68 65 72 65 4c 6f 6f 70 20 57 68 65 72 65 4c  WhereLoop WhereL
05a0: 6f 6f 70 3b 0a 74 79 70 65 64 65 66 20 73 74 72  oop;.typedef str
05b0: 75 63 74 20 57 68 65 72 65 50 61 74 68 20 57 68  uct WherePath Wh
05c0: 65 72 65 50 61 74 68 3b 0a 74 79 70 65 64 65 66  erePath;.typedef
05d0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
05e0: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 74 79 70  m WhereTerm;.typ
05f0: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0600: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 57 68 65  eLoopBuilder Whe
0610: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 3b 0a 74  reLoopBuilder;.t
0620: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
0630: 65 72 65 53 63 61 6e 20 57 68 65 72 65 53 63 61  ereScan WhereSca
0640: 6e 3b 0a 74 79 70 65 64 65 66 20 66 6c 6f 61 74  n;.typedef float
0650: 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a 0a   WhereCost;../*.
0660: 2a 2a 20 46 6f 72 20 65 61 63 68 20 6e 65 73 74  ** For each nest
0670: 65 64 20 6c 6f 6f 70 20 69 6e 20 61 20 57 48 45  ed loop in a WHE
0680: 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c 65 6d  RE clause implem
0690: 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 57 68  entation, the Wh
06a0: 65 72 65 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ereInfo.** struc
06b0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ture contains a 
06c0: 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20  single instance 
06d0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
06e0: 65 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75  e.  This structu
06f0: 72 65 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65  re.** is intende
0700: 64 20 74 6f 20 62 65 20 70 72 69 76 61 74 65 20  d to be private 
0710: 74 6f 20 74 68 65 20 77 68 65 72 65 2e 63 20 6d  to the where.c m
0720: 6f 64 75 6c 65 20 61 6e 64 20 73 68 6f 75 6c 64  odule and should
0730: 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63 65 73   not be.** acces
0740: 73 20 6f 72 20 6d 6f 64 69 66 69 65 64 20 62 79  s or modified by
0750: 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 2e 0a   other modules..
0760: 2a 2a 0a 2a 2a 20 54 68 65 20 70 49 64 78 49 6e  **.** The pIdxIn
0770: 66 6f 20 66 69 65 6c 64 20 69 73 20 75 73 65 64  fo field is used
0780: 20 74 6f 20 68 65 6c 70 20 70 69 63 6b 20 74 68   to help pick th
0790: 65 20 62 65 73 74 20 69 6e 64 65 78 20 6f 6e 20  e best index on 
07a0: 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62  a.** virtual tab
07b0: 6c 65 2e 20 20 54 68 65 20 70 49 64 78 49 6e 66  le.  The pIdxInf
07c0: 6f 20 70 6f 69 6e 74 65 72 20 63 6f 6e 74 61 69  o pointer contai
07d0: 6e 73 20 69 6e 64 65 78 69 6e 67 0a 2a 2a 20 69  ns indexing.** i
07e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
07f0: 68 65 20 69 2d 74 68 20 74 61 62 6c 65 20 69 6e  he i-th table in
0800: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
0810: 20 62 65 66 6f 72 65 20 72 65 6f 72 64 65 72 69   before reorderi
0820: 6e 67 2e 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 70  ng..** All the p
0830: 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 65 72 73  IdxInfo pointers
0840: 20 61 72 65 20 66 72 65 65 64 20 62 79 20 77 68   are freed by wh
0850: 65 72 65 49 6e 66 6f 46 72 65 65 28 29 20 69 6e  ereInfoFree() in
0860: 20 77 68 65 72 65 2e 63 2e 0a 2a 2a 20 41 6c 6c   where.c..** All
0870: 20 6f 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69   other informati
0880: 6f 6e 20 69 6e 20 74 68 65 20 69 2d 74 68 20 57  on in the i-th W
0890: 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74  hereLevel object
08a0: 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 61   for the i-th ta
08b0: 62 6c 65 0a 2a 2a 20 61 66 74 65 72 20 46 52 4f  ble.** after FRO
08c0: 4d 20 63 6c 61 75 73 65 20 6f 72 64 65 72 69 6e  M clause orderin
08d0: 67 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  g..*/.struct Whe
08e0: 72 65 4c 65 76 65 6c 20 7b 0a 20 20 69 6e 74 20  reLevel {.  int 
08f0: 69 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20  iLeftJoin;      
0900: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
0910: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
0920: 6e 74 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  nt LEFT OUTER JO
0930: 49 4e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  IN */.  int iTab
0940: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur;          /*
0950: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
0960: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
0970: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
0980: 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
0990: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
09a0: 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
09b0: 61 63 63 65 73 73 20 70 49 64 78 20 2a 2f 0a 20  access pIdx */. 
09c0: 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20   int addrBrk;   
09d0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
09e0: 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
09f0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
0a00: 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20    int addrNxt;  
0a10: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
0a20: 68 65 72 65 20 74 6f 20 73 74 61 72 74 20 74 68  here to start th
0a30: 65 20 6e 65 78 74 20 49 4e 20 63 6f 6d 62 69 6e  e next IN combin
0a40: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ation */.  int a
0a50: 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20  ddrCont;        
0a60: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
0a70: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
0a80: 68 65 20 6e 65 78 74 20 6c 6f 6f 70 20 63 79 63  he next loop cyc
0a90: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
0aa0: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  First;        /*
0ab0: 20 46 69 72 73 74 20 69 6e 73 74 72 75 63 74 69   First instructi
0ac0: 6f 6e 20 6f 66 20 69 6e 74 65 72 69 6f 72 20 6f  on of interior o
0ad0: 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
0ae0: 75 38 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20  u8 iFrom;       
0af0: 2f 2a 20 46 49 58 4d 45 3a 20 57 68 69 63 68 20  /* FIXME: Which 
0b00: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 46 52 4f  entry in the FRO
0b10: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 38  M clause */.  u8
0b20: 20 6f 70 2c 20 70 35 3b 20 20 20 20 20 20 20 20   op, p5;        
0b30: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 61 6e      /* Opcode an
0b40: 64 20 50 35 20 6f 66 20 74 68 65 20 6f 70 63 6f  d P5 of the opco
0b50: 64 65 20 74 68 61 74 20 65 6e 64 73 20 74 68 65  de that ends the
0b60: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 70   loop */.  int p
0b70: 31 2c 20 70 32 3b 20 20 20 20 20 20 20 20 20 20  1, p2;          
0b80: 20 2f 2a 20 4f 70 65 72 61 6e 64 73 20 6f 66 20   /* Operands of 
0b90: 74 68 65 20 6f 70 63 6f 64 65 20 75 73 65 64 20  the opcode used 
0ba0: 74 6f 20 65 6e 64 73 20 74 68 65 20 6c 6f 6f 70  to ends the loop
0bb0: 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 20 20 20   */.  union {   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
0bd0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
0be0: 64 65 70 65 6e 64 73 20 6f 6e 20 70 6c 61 6e 2e  depends on plan.
0bf0: 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 20 20 73  wsFlags */.    s
0c00: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 69 6e  truct {.      in
0c10: 74 20 6e 49 6e 3b 20 20 20 20 20 20 20 20 20 20  t nIn;          
0c20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0c30: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 49 6e 4c   entries in aInL
0c40: 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73  oop[] */.      s
0c50: 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 7b 0a 20  truct InLoop {. 
0c60: 20 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 3b         int iCur;
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0c80: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
0c90: 20 75 73 65 64 20 62 79 20 74 68 69 73 20 49 4e   used by this IN
0ca0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
0cb0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 54       int addrInT
0cc0: 6f 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  op;         /* T
0cd0: 6f 70 20 6f 66 20 74 68 65 20 49 4e 20 6c 6f 6f  op of the IN loo
0ce0: 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 38 20  p */.        u8 
0cf0: 65 45 6e 64 4c 6f 6f 70 4f 70 3b 20 20 20 20 20  eEndLoopOp;     
0d00: 20 20 20 20 2f 2a 20 49 4e 20 4c 6f 6f 70 20 74      /* IN Loop t
0d10: 65 72 6d 69 6e 61 74 6f 72 2e 20 4f 50 5f 4e 65  erminator. OP_Ne
0d20: 78 74 20 6f 72 20 4f 50 5f 50 72 65 76 20 2a 2f  xt or OP_Prev */
0d30: 0a 20 20 20 20 20 20 7d 20 2a 61 49 6e 4c 6f 6f  .      } *aInLoo
0d40: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
0d50: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
0d60: 74 20 65 61 63 68 20 6e 65 73 74 65 64 20 49 4e  t each nested IN
0d70: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
0d80: 20 7d 20 69 6e 3b 20 20 20 20 20 20 20 20 20 20   } in;          
0d90: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 77         /* Used w
0da0: 68 65 6e 20 70 6c 61 6e 2e 77 73 46 6c 61 67 73  hen plan.wsFlags
0db0: 26 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 2a  &WHERE_IN_ABLE *
0dc0: 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
0dd0: 76 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 50  vidx;       /* P
0de0: 6f 73 73 69 62 6c 65 20 63 6f 76 65 72 69 6e 67  ossible covering
0df0: 20 69 6e 64 65 78 20 66 6f 72 20 57 48 45 52 45   index for WHERE
0e00: 5f 4d 55 4c 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d  _MULTI_OR */.  }
0e10: 20 75 3b 0a 20 20 73 74 72 75 63 74 20 57 68 65   u;.  struct Whe
0e20: 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
0e30: 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 65 64   /* The selected
0e40: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
0e50: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  t */.};../*.** E
0e60: 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
0e70: 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72  this object repr
0e80: 65 73 65 6e 74 73 20 61 20 77 61 79 20 6f 66 20  esents a way of 
0e90: 65 76 61 6c 75 61 74 69 6e 67 20 6f 6e 65 0a 2a  evaluating one.*
0ea0: 2a 20 74 65 72 6d 20 6f 66 20 61 20 6a 6f 69 6e  * term of a join
0eb0: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
0ec0: 73 65 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20  se object holds 
0ed0: 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 73 65  a table of these
0ee0: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 75 73 69 6e  .** objects usin
0ef0: 67 20 28 6d 61 73 6b 53 65 6c 66 2c 70 72 65 72  g (maskSelf,prer
0f00: 65 71 2c 29 20 61 73 20 74 68 65 20 70 72 69 6d  eq,) as the prim
0f10: 61 72 79 20 6b 65 79 2e 20 20 4e 6f 74 65 20 74  ary key.  Note t
0f20: 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  hat the.** same 
0f30: 6a 6f 69 6e 20 74 65 72 6d 20 6d 69 67 68 74 20  join term might 
0f40: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 61 73  have multiple as
0f50: 73 6f 63 69 61 74 65 64 20 57 68 65 72 65 4c 6f  sociated WhereLo
0f60: 6f 70 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73  op objects..*/.s
0f70: 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 20  truct WhereLoop 
0f80: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  {.  Bitmask prer
0f90: 65 71 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74  eq;       /* Bit
0fa0: 6d 61 73 6b 20 6f 66 20 6f 74 68 65 72 20 6c 6f  mask of other lo
0fb0: 6f 70 73 20 74 68 61 74 20 6d 75 73 74 20 72 75  ops that must ru
0fc0: 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20 42 69 74  n first */.  Bit
0fd0: 6d 61 73 6b 20 6d 61 73 6b 53 65 6c 66 3b 20 20  mask maskSelf;  
0fe0: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 69 64     /* Bitmask id
0ff0: 65 6e 74 69 66 79 69 6e 67 20 74 61 62 6c 65 20  entifying table 
1000: 69 54 61 62 20 2a 2f 0a 23 69 66 64 65 66 20 53  iTab */.#ifdef S
1010: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 63 68  QLITE_DEBUG.  ch
1020: 61 72 20 63 49 64 3b 20 20 20 20 20 20 20 20 20  ar cId;         
1030: 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 69 63 20      /* Symbolic 
1040: 49 44 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20  ID of this loop 
1050: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  for debugging us
1060: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 75 38  e */.#endif.  u8
1070: 20 69 54 61 62 3b 20 20 20 20 20 20 20 20 20 20   iTab;          
1080: 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
1090: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  in FROM clause o
10a0: 66 20 74 61 62 6c 65 20 66 6f 72 20 74 68 69 73  f table for this
10b0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 69 53   loop */.  u8 iS
10c0: 6f 72 74 49 64 78 3b 20 20 20 20 20 20 20 20 20  ortIdx;         
10d0: 20 2f 2a 20 53 6f 72 74 69 6e 67 20 69 6e 64 65   /* Sorting inde
10e0: 78 20 6e 75 6d 62 65 72 2e 20 20 30 3d 3d 4e 6f  x number.  0==No
10f0: 6e 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 54 65  ne */.  u16 nLTe
1100: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
1110: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1120: 65 73 20 69 6e 20 61 4c 54 65 72 6d 5b 5d 20 2a  es in aLTerm[] *
1130: 2f 0a 20 20 75 31 36 20 6e 4c 53 6c 6f 74 3b 20  /.  u16 nLSlot; 
1140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1150: 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c  ber of slots all
1160: 6f 63 61 74 65 64 20 66 6f 72 20 61 4c 54 65 72  ocated for aLTer
1170: 6d 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 77 73 46  m[] */.  u32 wsF
1180: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 2f  lags;          /
1190: 2a 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  * WHERE_* flags 
11a0: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 70  describing the p
11b0: 6c 61 6e 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  lan */.  WhereCo
11c0: 73 74 20 72 53 65 74 75 70 3b 20 20 20 20 20 2f  st rSetup;     /
11d0: 2a 20 4f 6e 65 2d 74 69 6d 65 20 73 65 74 75 70  * One-time setup
11e0: 20 63 6f 73 74 20 28 65 78 3a 20 63 72 65 61 74   cost (ex: creat
11f0: 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  e transient inde
1200: 78 29 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  x) */.  WhereCos
1210: 74 20 72 52 75 6e 3b 20 20 20 20 20 20 20 2f 2a  t rRun;       /*
1220: 20 43 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67   Cost of running
1230: 20 65 61 63 68 20 6c 6f 6f 70 20 2a 2f 0a 20 20   each loop */.  
1240: 57 68 65 72 65 43 6f 73 74 20 6e 4f 75 74 3b 20  WhereCost nOut; 
1250: 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
1260: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
1270: 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 75 6e  put rows */.  un
1280: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
1290: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
12a0: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
12b0: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 62 74 72  for internal btr
12c0: 65 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  ee tables */.   
12d0: 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20     int nEq;     
12e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12f0: 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
1300: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1310: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64       Index *pInd
1320: 65 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ex;         /* I
1330: 6e 64 65 78 20 75 73 65 64 2c 20 6f 72 20 4e 55  ndex used, or NU
1340: 4c 4c 20 2a 2f 0a 20 20 20 20 7d 20 62 74 72 65  LL */.    } btre
1350: 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 7b 20  e;.    struct { 
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1370: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   Information for
1380: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
1390: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  */.      int idx
13a0: 4e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Num;            
13b0: 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
13c0: 2a 2f 0a 20 20 20 20 20 20 75 38 20 6e 65 65 64  */.      u8 need
13d0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
13e0: 2f 2a 20 54 72 75 65 20 69 66 20 73 71 6c 69 74  /* True if sqlit
13f0: 65 33 5f 66 72 65 65 28 69 64 78 53 74 72 29 20  e3_free(idxStr) 
1400: 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20  is needed */.   
1410: 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 3b     u8 isOrdered;
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1430: 65 20 69 66 20 73 61 74 69 73 66 69 65 73 20 4f  e if satisfies O
1440: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 20  RDER BY */.     
1450: 20 75 31 36 20 6f 6d 69 74 4d 61 73 6b 3b 20 20   u16 omitMask;  
1460: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 73          /* Terms
1470: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 6d 69   that may be omi
1480: 74 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 63 68  tted */.      ch
1490: 61 72 20 2a 69 64 78 53 74 72 3b 20 20 20 20 20  ar *idxStr;     
14a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 64       /* Index id
14b0: 65 6e 74 69 66 69 65 72 20 73 74 72 69 6e 67 20  entifier string 
14c0: 2a 2f 0a 20 20 20 20 7d 20 76 74 61 62 3b 0a 20  */.    } vtab;. 
14d0: 20 7d 20 75 3b 0a 20 20 57 68 65 72 65 54 65 72   } u;.  WhereTer
14e0: 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20 20 20 2f 2a  m **aLTerm;   /*
14f0: 20 57 68 65 72 65 54 65 72 6d 73 20 75 73 65 64   WhereTerms used
1500: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
1510: 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f 2a 20 4e  *pNextLoop; /* N
1520: 65 78 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ext WhereLoop ob
1530: 6a 65 63 74 20 69 6e 20 74 68 65 20 57 68 65 72  ject in the Wher
1540: 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65  eClause */.  Whe
1550: 72 65 54 65 72 6d 20 2a 61 4c 54 65 72 6d 53 70  reTerm *aLTermSp
1560: 61 63 65 5b 34 5d 3b 20 20 2f 2a 20 49 6e 69 74  ace[4];  /* Init
1570: 69 61 6c 20 61 4c 54 65 72 6d 5b 5d 20 73 70 61  ial aLTerm[] spa
1580: 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46 6f 72  ce */.};../* For
1590: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
15a0: 20 6f 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73   of methods */.s
15b0: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
15c0: 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65  oopResize(sqlite
15d0: 33 2a 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20  3*, WhereLoop*, 
15e0: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  int);../*.** Eac
15f0: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
1600: 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20  is object holds 
1610: 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 57 68  a sequence of Wh
1620: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 0a  ereLoop objects.
1630: 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ** that implemen
1640: 74 20 73 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f 66  t some or all of
1650: 20 74 68 65 20 65 6e 74 69 72 65 20 71 75 65 72   the entire quer
1660: 79 20 70 6c 61 6e 2e 20 20 0a 2a 2f 0a 73 74 72  y plan.  .*/.str
1670: 75 63 74 20 57 68 65 72 65 50 61 74 68 20 7b 0a  uct WherePath {.
1680: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4c 6f    Bitmask maskLo
1690: 6f 70 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  op;     /* Bitma
16a0: 73 6b 20 6f 66 20 61 6c 6c 20 57 68 65 72 65 4c  sk of all WhereL
16b0: 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  oop objects in t
16c0: 68 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 42 69  his path */.  Bi
16d0: 74 6d 61 73 6b 20 72 65 76 4c 6f 6f 70 3b 20 20  tmask revLoop;  
16e0: 20 20 20 20 2f 2a 20 61 4c 6f 6f 70 5b 5d 73 20      /* aLoop[]s 
16f0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 72  that should be r
1700: 65 76 65 72 73 65 64 20 66 6f 72 20 4f 52 44 45  eversed for ORDE
1710: 52 20 42 59 20 2a 2f 0a 20 20 57 68 65 72 65 43  R BY */.  WhereC
1720: 6f 73 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  ost nRow;       
1730: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
1740: 62 65 72 20 6f 66 20 72 6f 77 73 20 67 65 6e 65  ber of rows gene
1750: 72 61 74 65 64 20 62 79 20 74 68 69 73 20 70 61  rated by this pa
1760: 74 68 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  th */.  WhereCos
1770: 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a  t rCost;      /*
1780: 20 54 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 74   Total cost of t
1790: 68 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 75 38  his path */.  u8
17a0: 20 69 73 4f 72 64 65 72 65 64 3b 20 20 20 20 20   isOrdered;     
17b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
17c0: 68 69 73 20 70 61 74 68 20 73 61 74 69 73 66 69  his path satisfi
17d0: 65 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  es ORDER BY */. 
17e0: 20 75 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c   u8 isOrderedVal
17f0: 69 64 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69  id;    /* True i
1800: 66 20 74 68 65 20 69 73 4f 72 64 65 72 65 64 20  f the isOrdered 
1810: 66 69 65 6c 64 20 69 73 20 76 61 6c 69 64 20 2a  field is valid *
1820: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
1830: 61 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 41 72 72  aLoop;    /* Arr
1840: 61 79 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ay of WhereLoop 
1850: 6f 62 6a 65 63 74 73 20 69 6d 70 6c 65 6d 65 6e  objects implemen
1860: 74 69 6e 67 20 74 68 69 73 20 70 61 74 68 20 2a  ting this path *
1870: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
1880: 71 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72 20  query generator 
1890: 75 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f 66  uses an array of
18a0: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
18b0: 69 73 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a  is structure to.
18c0: 2a 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c 79  ** help it analy
18d0: 7a 65 20 74 68 65 20 73 75 62 65 78 70 72 65 73  ze the subexpres
18e0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48 45  sions of the WHE
18f0: 52 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63 68  RE clause.  Each
1900: 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65   WHERE.** clause
1910: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
1920: 73 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  s separated from
1930: 20 74 68 65 20 6f 74 68 65 72 73 20 62 79 20 41   the others by A
1940: 4e 44 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a  ND operators,.**
1950: 20 75 73 75 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d   usually, or som
1960: 65 74 69 6d 65 73 20 73 75 62 65 78 70 72 65 73  etimes subexpres
1970: 73 69 6f 6e 73 20 73 65 70 61 72 61 74 65 64 20  sions separated 
1980: 62 79 20 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  by OR..**.** All
1990: 20 57 68 65 72 65 54 65 72 6d 73 20 61 72 65 20   WhereTerms are 
19a0: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61  collected into a
19b0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 43 6c 61   single WhereCla
19c0: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  use structure.  
19d0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
19e0: 67 20 69 64 65 6e 74 69 74 79 20 68 6f 6c 64 73  g identity holds
19f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
1a00: 68 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b  hereTerm.pWC->a[
1a10: 57 68 65 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d  WhereTerm.idx] =
1a20: 3d 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a  = WhereTerm.**.*
1a30: 2a 20 57 68 65 6e 20 61 20 74 65 72 6d 20 69 73  * When a term is
1a40: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
1a50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1a60: 20 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a   X <op> <expr>.*
1a70: 2a 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20  *.** where X is 
1a80: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e  a column name an
1a90: 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  d <op> is one of
1aa0: 20 63 65 72 74 61 69 6e 20 6f 70 65 72 61 74 6f   certain operato
1ab0: 72 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72  rs,.** then Wher
1ac0: 65 54 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72  eTerm.leftCursor
1ad0: 20 61 6e 64 20 57 68 65 72 65 54 65 72 6d 2e 75   and WhereTerm.u
1ae0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f  .leftColumn reco
1af0: 72 64 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  rd the.** cursor
1b00: 20 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75   number and colu
1b10: 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e  mn number for X.
1b20: 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65    WhereTerm.eOpe
1b30: 72 61 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a  rator records.**
1b40: 20 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20   the <op> using 
1b50: 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69  a bitmask encodi
1b60: 6e 67 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f  ng defined by WO
1b70: 5f 78 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65  _xxx below.  The
1b80: 0a 2a 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74  .** use of a bit
1b90: 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f  mask encoding fo
1ba0: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61  r the operator a
1bb0: 6c 6c 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72  llows us to sear
1bc0: 63 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f  ch.** quickly fo
1bd0: 72 20 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74  r terms that mat
1be0: 63 68 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61  ch any of severa
1bf0: 6c 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72  l different oper
1c00: 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57  ators..**.** A W
1c10: 68 65 72 65 54 65 72 6d 20 6d 69 67 68 74 20 61  hereTerm might a
1c20: 6c 73 6f 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f  lso be two or mo
1c30: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e  re subterms conn
1c40: 65 63 74 65 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a  ected by OR:.**.
1c50: 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 2e 58  **         (t1.X
1c60: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52   <op> <expr>) OR
1c70: 20 28 74 31 2e 59 20 3c 6f 70 3e 20 3c 65 78 70   (t1.Y <op> <exp
1c80: 72 3e 29 20 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a  r>) OR .....**.*
1c90: 2a 20 49 6e 20 74 68 69 73 20 73 65 63 6f 6e 64  * In this second
1ca0: 20 63 61 73 65 2c 20 77 74 46 6c 61 67 20 61 73   case, wtFlag as
1cb0: 20 74 68 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f   the TERM_ORINFO
1cc0: 20 73 65 74 20 61 6e 64 20 65 4f 70 65 72 61 74   set and eOperat
1cd0: 6f 72 3d 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64  or==WO_OR.** and
1ce0: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75   the WhereTerm.u
1cf0: 2e 70 4f 72 49 6e 66 6f 20 66 69 65 6c 64 20 70  .pOrInfo field p
1d00: 6f 69 6e 74 73 20 74 6f 20 61 75 78 69 6c 69 61  oints to auxilia
1d10: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ry information t
1d20: 68 61 74 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65 63  hat.** is collec
1d30: 74 65 64 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a  ted about the.**
1d40: 0a 2a 2a 20 49 66 20 61 20 74 65 72 6d 20 69 6e  .** If a term in
1d50: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1d60: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
1d70: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74   either of the t
1d80: 77 6f 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63  wo previous.** c
1d90: 61 74 65 67 6f 72 69 65 73 2c 20 74 68 65 6e 20  ategories, then 
1da0: 65 4f 70 65 72 61 74 6f 72 3d 3d 30 2e 20 20 54  eOperator==0.  T
1db0: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 70 45 78  he WhereTerm.pEx
1dc0: 70 72 20 66 69 65 6c 64 20 69 73 20 73 74 69 6c  pr field is stil
1dd0: 6c 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20  l set.** to the 
1de0: 6f 72 69 67 69 6e 61 6c 20 73 75 62 65 78 70 72  original subexpr
1df0: 65 73 73 69 6f 6e 20 63 6f 6e 74 65 6e 74 20 61  ession content a
1e00: 6e 64 20 77 74 46 6c 61 67 73 20 69 73 20 73 65  nd wtFlags is se
1e10: 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65  t up appropriate
1e20: 6c 79 0a 2a 2a 20 62 75 74 20 6e 6f 20 6f 74 68  ly.** but no oth
1e30: 65 72 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  er fields in the
1e40: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
1e50: 74 20 61 72 65 20 6d 65 61 6e 69 6e 67 66 75 6c  t are meaningful
1e60: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 65 4f 70  ..**.** When eOp
1e70: 65 72 61 74 6f 72 21 3d 30 2c 20 70 72 65 72 65  erator!=0, prere
1e80: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
1e90: 71 41 6c 6c 20 72 65 63 6f 72 64 20 73 65 74 73  qAll record sets
1ea0: 20 6f 66 20 63 75 72 73 6f 72 20 6e 75 6d 62 65   of cursor numbe
1eb0: 72 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79 20  rs,.** but they 
1ec0: 64 6f 20 73 6f 20 69 6e 64 69 72 65 63 74 6c 79  do so indirectly
1ed0: 2e 20 20 41 20 73 69 6e 67 6c 65 20 57 68 65 72  .  A single Wher
1ee0: 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
1ef0: 72 65 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a  re translates.**
1f00: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69   cursor number i
1f10: 6e 74 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65  nto bits and the
1f20: 20 74 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20   translated bit 
1f30: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
1f40: 20 70 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64   prereq.** field
1f50: 73 2e 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74  s.  The translat
1f60: 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f  ion is used in o
1f70: 72 64 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65  rder to maximize
1f80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
1f90: 2a 20 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c  * bits that will
1fa0: 20 66 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73   fit in a Bitmas
1fb0: 6b 2e 20 20 54 68 65 20 56 44 42 45 20 63 75 72  k.  The VDBE cur
1fc0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  sor numbers migh
1fd0: 74 20 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f  t be.** spread o
1fe0: 75 74 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d  ut over the non-
1ff0: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
2000: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  s.  For example,
2010: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e   the cursor.** n
2020: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 20  umbers might be 
2030: 33 2c 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c  3, 8, 9, 10, 20,
2040: 20 32 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e   23, 41, and 45.
2050: 20 20 54 68 65 20 57 68 65 72 65 4d 61 73 6b 53    The WhereMaskS
2060: 65 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73  et.** translates
2070: 20 74 68 65 73 65 20 73 70 61 72 73 65 20 63 75   these sparse cu
2080: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
2090: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
20a0: 74 65 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e  tegers.** beginn
20b0: 69 6e 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72  ing with 0 in or
20c0: 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  der to make the 
20d0: 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73  best possible us
20e0: 65 20 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62  e of the availab
20f0: 6c 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68  le.** bits in th
2100: 65 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20  e Bitmask.  So, 
2110: 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  in the example a
2120: 62 6f 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72  bove, the cursor
2130: 20 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c   numbers.** woul
2140: 64 20 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f  d be mapped into
2150: 20 69 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f   integers 0 thro
2160: 75 67 68 20 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ugh 7..**.** The
2170: 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
2180: 20 69 6e 20 61 20 6a 6f 69 6e 20 69 73 20 6c 69   in a join is li
2190: 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
21a0: 62 65 72 20 6f 66 20 62 69 74 73 0a 2a 2a 20 69  ber of bits.** i
21b0: 6e 20 70 72 65 72 65 71 52 69 67 68 74 20 61 6e  n prereqRight an
21c0: 64 20 70 72 65 72 65 71 41 6c 6c 2e 20 20 54 68  d prereqAll.  Th
21d0: 65 20 64 65 66 61 75 6c 74 20 69 73 20 36 34 20  e default is 64 
21e0: 62 69 74 73 2c 20 68 65 6e 63 65 20 53 51 4c 69  bits, hence SQLi
21f0: 74 65 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 62  te.** is only ab
2200: 6c 65 20 74 6f 20 70 72 6f 63 65 73 73 20 6a 6f  le to process jo
2210: 69 6e 73 20 77 69 74 68 20 36 34 20 6f 72 20 66  ins with 64 or f
2220: 65 77 65 72 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  ewer tables..*/.
2230: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
2240: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
2250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2260: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
2270: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
2280: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
2290: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
22b0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
22c0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
22d0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
22e0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
22f0: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
2300: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
2310: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
2320: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
2330: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
2340: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
2350: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
2360: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
2370: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
2380: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
2390: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
23a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65  nformation if (e
23b0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
23c0: 29 21 3d 30 20 2a 2f 0a 20 20 20 20 57 68 65 72  )!=0 */.    Wher
23d0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
23e0: 66 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66  fo; /* Extra inf
23f0: 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70  ormation if (eOp
2400: 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21  erator& WO_AND)!
2410: 3d 30 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75  =0 */.  } u;.  u
2420: 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  16 eOperator;   
2430: 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78         /* A WO_x
2440: 78 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69  x value describi
2450: 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20  ng <op> */.  u8 
2460: 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wtFlags;        
2470: 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78       /* TERM_xxx
2480: 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65   bit flags.  See
2490: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e   below */.  u8 n
24a0: 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
24b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24c0: 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d   children that m
24d0: 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a  ust disable us *
24e0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
24f0: 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54  *pWC;       /* T
2500: 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74  he clause this t
2510: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a  erm is part of *
2520: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
2530: 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42  eqRight;    /* B
2540: 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  itmask of tables
2550: 20 75 73 65 64 20 62 79 20 70 45 78 70 72 2d 3e   used by pExpr->
2560: 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d  pRight */.  Bitm
2570: 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20  ask prereqAll;  
2580: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
2590: 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  f tables referen
25a0: 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a  ced by pExpr */.
25b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
25c0: 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72  d values of Wher
25d0: 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f  eTerm.wtFlags.*/
25e0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59  .#define TERM_DY
25f0: 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20 20  NAMIC    0x01   
2600: 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20  /* Need to call 
2610: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2620: 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a  e(db, pExpr) */.
2630: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52  #define TERM_VIR
2640: 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f  TUAL    0x02   /
2650: 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20 6f  * Added by the o
2660: 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f  ptimizer.  Do no
2670: 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e  t code */.#defin
2680: 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20  e TERM_CODED    
2690: 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73    0x04   /* This
26a0: 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79   term is already
26b0: 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e   coded */.#defin
26c0: 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20  e TERM_COPIED   
26d0: 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20    0x08   /* Has 
26e0: 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69  a child */.#defi
26f0: 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20  ne TERM_ORINFO  
2700: 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65 65     0x10   /* Nee
2710: 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68  d to free the Wh
2720: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
2730: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66  o object */.#def
2740: 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  ine TERM_ANDINFO
2750: 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e 65      0x20   /* Ne
2760: 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57  ed to free the W
2770: 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49  hereTerm.u.pAndI
2780: 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69  nfo obj */.#defi
2790: 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20  ne TERM_OR_OK   
27a0: 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73 65     0x40   /* Use
27b0: 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75  d during OR-clau
27c0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  se processing */
27d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
27e0: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 23 20 20 64  NABLE_STAT3.#  d
27f0: 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  efine TERM_VNULL
2800: 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61      0x80   /* Ma
2810: 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c  nufactured x>NUL
2820: 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72  L or x<=NULL ter
2830: 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65  m */.#else.#  de
2840: 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  fine TERM_VNULL 
2850: 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73     0x00   /* Dis
2860: 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69  abled if not usi
2870: 6e 67 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64  ng stat3 */.#end
2880: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
2890: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 57 68 65  tance of the Whe
28a0: 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 69 73  reScan object is
28b0: 20 75 73 65 64 20 61 73 20 61 6e 20 69 74 65 72   used as an iter
28c0: 61 74 6f 72 20 66 6f 72 20 6c 6f 63 61 74 69 6e  ator for locatin
28d0: 67 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68  g.** terms in th
28e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
28f0: 68 61 74 20 61 72 65 20 75 73 65 66 75 6c 20 74  hat are useful t
2900: 6f 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  o the query plan
2910: 6e 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  ner..*/.struct W
2920: 68 65 72 65 53 63 61 6e 20 7b 0a 20 20 57 68 65  hereScan {.  Whe
2930: 72 65 54 65 72 6d 20 2a 70 43 75 72 72 65 6e 74  reTerm *pCurrent
2940: 3b 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20  ;       /* Most 
2950: 72 65 63 65 6e 74 20 6d 61 74 63 68 20 2a 2f 0a  recent match */.
2960: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2970: 4f 72 69 67 57 43 3b 20 20 20 20 20 20 2f 2a 20  OrigWC;      /* 
2980: 4f 72 69 67 69 6e 61 6c 2c 20 69 6e 6e 65 72 6d  Original, innerm
2990: 6f 73 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  ost WhereClause 
29a0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
29b0: 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
29c0: 2f 2a 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  /* WhereClause c
29d0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 73  urrently being s
29e0: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72  canned */.  char
29f0: 20 2a 7a 43 6f 6c 6c 4e 61 6d 65 3b 20 20 20 20   *zCollName;    
2a00: 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
2a10: 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ed collating seq
2a20: 75 65 6e 63 65 2c 20 69 66 20 6e 6f 74 20 4e 55  uence, if not NU
2a30: 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 69 64 78  LL */.  char idx
2a40: 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
2a50: 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 74 63 68     /* Must match
2a60: 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 2c 20   this affinity, 
2a70: 69 66 20 7a 43 6f 6c 6c 4e 61 6d 65 21 3d 4e 55  if zCollName!=NU
2a80: 4c 4c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  LL */.  unsigned
2a90: 20 63 68 61 72 20 6e 45 71 75 69 76 3b 20 20 20   char nEquiv;   
2aa0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ab0: 65 6e 74 72 69 65 73 20 69 6e 20 61 45 71 75 69  entries in aEqui
2ac0: 76 5b 5d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  v[] */.  unsigne
2ad0: 64 20 63 68 61 72 20 69 45 71 75 69 76 3b 20 20  d char iEquiv;  
2ae0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
2af0: 65 64 20 73 6c 6f 74 20 69 6e 20 61 45 71 75 69  ed slot in aEqui
2b00: 76 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d  v[] */.  u32 opM
2b10: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
2b20: 20 20 20 20 2f 2a 20 41 63 63 65 70 74 61 62 6c      /* Acceptabl
2b30: 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  e operators */. 
2b40: 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b60: 65 73 75 6d 65 20 73 63 61 6e 6e 69 6e 67 20 61  esume scanning a
2b70: 74 20 74 68 69 73 2d 3e 70 57 43 2d 3e 61 5b 74  t this->pWC->a[t
2b80: 68 69 73 2d 3e 6b 5d 20 2a 2f 0a 20 20 69 6e 74  his->k] */.  int
2b90: 20 61 45 71 75 69 76 5b 32 32 5d 3b 20 20 20 20   aEquiv[22];    
2ba0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
2bb0: 72 2c 43 6f 6c 75 6d 6e 20 70 61 69 72 73 20 66  r,Column pairs f
2bc0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 63 65 20 63  or equivalence c
2bd0: 6c 61 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lasses */.};../*
2be0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2bf0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2c00: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
2c10: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2c20: 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52   about a.** WHER
2c30: 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c  E clause.  Mostl
2c40: 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74  y this is a cont
2c50: 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72  ainer for one or
2c60: 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73   more WhereTerms
2c70: 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 6c 61 6e 61 74  ..**.** Explanat
2c80: 69 6f 6e 20 6f 66 20 70 4f 75 74 65 72 3a 20 20  ion of pOuter:  
2c90: 46 6f 72 20 61 20 57 48 45 52 45 20 63 6c 61 75  For a WHERE clau
2ca0: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  se of the form.*
2cb0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
2cc0: 20 41 4e 44 20 28 28 62 20 41 4e 44 20 63 29 20   AND ((b AND c) 
2cd0: 4f 52 20 28 64 20 41 4e 44 20 65 29 29 20 41 4e  OR (d AND e)) AN
2ce0: 44 20 66 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  D f.**.** There 
2cf0: 61 72 65 20 73 65 70 61 72 61 74 65 20 57 68 65  are separate Whe
2d00: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 73  reClause objects
2d10: 20 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63   for the whole c
2d20: 6c 61 75 73 65 20 61 6e 64 20 66 6f 72 0a 2a 2a  lause and for.**
2d30: 20 74 68 65 20 73 75 62 63 6c 61 75 73 65 73 20   the subclauses 
2d40: 22 28 62 20 41 4e 44 20 63 29 22 20 61 6e 64 20  "(b AND c)" and 
2d50: 22 28 64 20 41 4e 44 20 65 29 22 2e 20 20 54 68  "(d AND e)".  Th
2d60: 65 20 70 4f 75 74 65 72 20 66 69 65 6c 64 20 6f  e pOuter field o
2d70: 66 20 74 68 65 0a 2a 2a 20 73 75 62 63 6c 61 75  f the.** subclau
2d80: 73 65 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ses points to th
2d90: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
2da0: 6a 65 63 74 20 66 6f 72 20 74 68 65 20 77 68 6f  ject for the who
2db0: 6c 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  le clause..*/.st
2dc0: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
2dd0: 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a   {.  WhereInfo *
2de0: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 2f 2a  pWInfo;       /*
2df0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
2e00: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
2e10: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
2e20: 65 20 2a 70 4f 75 74 65 72 3b 20 20 20 20 20 2f  e *pOuter;     /
2e30: 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75 6e 63 74  * Outer conjunct
2e40: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20  ion */.  u8 op; 
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70 65 72 61    /* Split opera
2e70: 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20  tor.  TK_AND or 
2e80: 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69 6e 74 20 6e  TK_OR */.  int n
2e90: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
2ea0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2eb0: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
2ec0: 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
2ed0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ee0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d  f entries in a[]
2ef0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
2f00: 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *a;            /
2f10: 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63 72  * Each a[] descr
2f20: 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ibes a term of t
2f30: 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65 20  he WHERE cluase 
2f40: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
2f50: 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41 43  QLITE_SMALL_STAC
2f60: 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61  K).  WhereTerm a
2f70: 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f 2a  Static[1];    /*
2f80: 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20   Initial static 
2f90: 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f  space for a[] */
2fa0: 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54 65  .#else.  WhereTe
2fb0: 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20 20  rm aStatic[8];  
2fc0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
2fd0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
2fe0: 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  ] */.#endif.};..
2ff0: 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  /*.** A WhereTer
3000: 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f 72  m with eOperator
3010: 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73 20  ==WO_OR has its 
3020: 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74 65  u.pOrInfo pointe
3030: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79  r set to.** a dy
3040: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
3050: 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ted instance of 
3060: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3070: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
3080: 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 7b  ct WhereOrInfo {
3090: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 77  .  WhereClause w
30a0: 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  c;          /* D
30b0: 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e 74  ecomposition int
30c0: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
30d0: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
30e0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  e;       /* Bitm
30f0: 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78  ask of all index
3100: 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20 74  able tables in t
3110: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b 0a  he clause */.};.
3120: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
3130: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
3140: 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69 74  r==WO_AND has it
3150: 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f 69  s u.pAndInfo poi
3160: 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61  nter set to.** a
3170: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
3180: 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20  ocated instance 
3190: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
31a0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
31b0: 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49 6e  truct WhereAndIn
31c0: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
31d0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
31e0: 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65 73  /* The subexpres
31f0: 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74 20  sion broken out 
3200: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3210: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3220: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3230: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
3240: 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  of a mapping.** 
3250: 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75 72  between VDBE cur
3260: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20  sor numbers and 
3270: 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d  bits of the bitm
3280: 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72  asks in WhereTer
3290: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  m..**.** The VDB
32a0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
32b0: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
32c0: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
32d0: 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65   .** SrcList_ite
32e0: 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78  m.iCursor and Ex
32f0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
3300: 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e  .  For any given
3310: 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73   WHERE .** claus
3320: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
3330: 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  mbers might not 
3340: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
3350: 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63   they might.** c
3360: 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74  ontain gaps in t
3370: 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71  he numbering seq
3380: 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77  uence.  But we w
3390: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69  ant to make maxi
33a0: 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68  mum.** use of th
33b0: 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69  e bits in our bi
33c0: 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74  tmasks.  This st
33d0: 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73  ructure provides
33e0: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72   a mapping.** fr
33f0: 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75  om the sparse cu
3400: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
3410: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
3420: 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  tegers beginning
3430: 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a  .** with 0..**.*
3440: 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53 65  * If WhereMaskSe
3450: 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65  t.ix[A]==B it me
3460: 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74  ans that The A-t
3470: 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61  h bit of a Bitma
3480: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
3490: 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  s VDBE cursor nu
34a0: 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74  mber B.  The A-t
34b0: 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61  h bit of a bitma
34c0: 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a  sk is 1<<A..**.*
34d0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
34e0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
34f0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  se expression us
3500: 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a  ed these VDBE.**
3510: 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c   cursors:  4, 5,
3520: 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20   8, 29, 57, 73. 
3530: 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72 65   Then the  Where
3540: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
3550: 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74  e.** would map t
3560: 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  hose cursor numb
3570: 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20  ers into bits 0 
3580: 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a  through 5..**.**
3590: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d   Note that the m
35a0: 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  apping is not ne
35b0: 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65  cessarily ordere
35c0: 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70  d.  In the examp
35d0: 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65  le.** above, the
35e0: 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67   mapping might g
35f0: 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d  o like this:  4-
3600: 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20  >3, 5->1, 8->2, 
3610: 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c  29->0,.** 57->5,
3620: 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20   73->4.  Or one 
3630: 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d  of 719 other com
3640: 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  binations might 
3650: 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64  be used. It.** d
3660: 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d  oes not really m
3670: 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20  atter.  What is 
3680: 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61  important is tha
3690: 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a  t sparse cursor.
36a0: 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67  ** numbers all g
36b0: 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62  et mapped into b
36c0: 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20  it numbers that 
36d0: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
36e0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67   contain.** no g
36f0: 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  aps..*/.struct W
3700: 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20 20  hereMaskSet {.  
3710: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3730: 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69 67   Number of assig
3740: 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75 65  ned cursor value
3750: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42 4d  s */.  int ix[BM
3760: 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  S];             
3770: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 61       /* Cursor a
3780: 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20  ssigned to each 
3790: 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  bit */.};../*.**
37a0: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
37b0: 61 20 66 61 63 74 6f 72 79 20 66 6f 72 20 57 68  a factory for Wh
37c0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
37d0: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
37e0: 20 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 72 75 63   query..*/.struc
37f0: 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t WhereLoopBuild
3800: 65 72 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er {.  WhereInfo
3810: 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
3820: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
3830: 61 62 6f 75 74 20 74 68 69 73 20 57 48 45 52 45  about this WHERE
3840: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3850: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
3860: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
3870: 74 65 72 6d 73 20 2a 2f 0a 20 20 45 78 70 72 4c  terms */.  ExprL
3880: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
3890: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
38a0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
38b0: 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
38c0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
38d0: 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  te WhereLoop */.
38e0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 42 65    WhereLoop *pBe
38f0: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  st;         /* I
3900: 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 73 74 6f 72  f non-NULL, stor
3910: 65 20 73 69 6e 67 6c 65 20 62 65 73 74 20 6c 6f  e single best lo
3920: 6f 70 20 68 65 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f  op here */.};../
3930: 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20 63  *.** The WHERE c
3940: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
3950: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77 6f   routine has two
3960: 20 68 61 6c 76 65 73 2e 20 20 54 68 65 0a 2a 2a   halves.  The.**
3970: 20 66 69 72 73 74 20 70 61 72 74 20 64 6f 65 73   first part does
3980: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
3990: 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e 64  e WHERE loop and
39a0: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 68   the second.** h
39b0: 61 6c 66 20 64 6f 65 73 20 74 68 65 20 74 61 69  alf does the tai
39c0: 6c 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  l of the WHERE l
39d0: 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 6e 63  oop.  An instanc
39e0: 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74 72  e of.** this str
39f0: 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e  ucture is return
3a00: 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
3a10: 68 61 6c 66 20 61 6e 64 20 70 61 73 73 65 64 0a  half and passed.
3a20: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 63 6f  ** into the seco
3a30: 6e 64 20 68 61 6c 66 20 74 6f 20 67 69 76 65 20  nd half to give 
3a40: 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74 79 2e  some continuity.
3a50: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
3a60: 49 6e 66 6f 20 7b 0a 20 20 50 61 72 73 65 20 2a  Info {.  Parse *
3a70: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
3a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
3a90: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
3aa0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
3ab0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
3ac0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ;        /* List
3ad0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
3ae0: 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  e join */.  Expr
3af0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
3b00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
3b10: 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
3b20: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
3b30: 73 74 20 2a 70 44 69 73 74 69 6e 63 74 3b 20 20  st *pDistinct;  
3b40: 20 20 20 20 2f 2a 20 44 49 53 54 49 4e 43 54 20      /* DISTINCT 
3b50: 4f 4e 20 76 61 6c 75 65 73 2c 20 6f 72 20 4e 55  ON values, or NU
3b60: 4c 4c 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  LL */.  Bitmask 
3b70: 72 65 76 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  revMask;        
3b80: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
3b90: 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
3ba0: 20 6e 65 65 64 20 72 65 76 65 72 73 69 6e 67 20   need reversing 
3bb0: 2a 2f 0a 20 20 75 31 36 20 6e 4f 42 53 61 74 3b  */.  u16 nOBSat;
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
3be0: 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
3bf0: 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 20  fied by indices 
3c00: 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
3c10: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ags;           /
3c20: 2a 20 46 6c 61 67 73 20 6f 72 69 67 69 6e 61 6c  * Flags original
3c30: 6c 79 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ly passed to sql
3c40: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
3c50: 20 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e 65 50 61   */.  u8 okOnePa
3c60: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ss;             
3c70: 2f 2a 20 4f 6b 20 74 6f 20 75 73 65 20 6f 6e 65  /* Ok to use one
3c80: 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20  -pass algorithm 
3c90: 66 6f 72 20 55 50 44 41 54 45 2f 44 45 4c 45 54  for UPDATE/DELET
3ca0: 45 20 2a 2f 0a 20 20 75 38 20 75 6e 74 65 73 74  E */.  u8 untest
3cb0: 65 64 54 65 72 6d 73 3b 20 20 20 20 20 20 20 20  edTerms;        
3cc0: 20 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57 48 45 52   /* Not all WHER
3cd0: 45 20 74 65 72 6d 73 20 72 65 73 6f 6c 76 65 64  E terms resolved
3ce0: 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70 20 2a   by outer loop *
3cf0: 2f 0a 20 20 75 38 20 65 44 69 73 74 69 6e 63 74  /.  u8 eDistinct
3d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3d10: 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   One of the WHER
3d20: 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 76 61 6c  E_DISTINCT_* val
3d30: 75 65 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 69  ues below */.  i
3d40: 6e 74 20 69 54 6f 70 3b 20 20 20 20 20 20 20 20  nt iTop;        
3d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3d60: 76 65 72 79 20 62 65 67 69 6e 6e 69 6e 67 20 6f  very beginning o
3d70: 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
3d80: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
3d90: 6e 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  nue;            
3da0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
3db0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
3dc0: 78 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  xt record */.  i
3dd0: 6e 74 20 69 42 72 65 61 6b 3b 20 20 20 20 20 20  nt iBreak;      
3de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
3df0: 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
3e00: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  ut of the loop *
3e10: 2f 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20  /.  int nLevel; 
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e30: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74 65   Number of neste
3e40: 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72  d loop */.  Wher
3e50: 65 4d 61 73 6b 53 65 74 20 73 4d 61 73 6b 53 65  eMaskSet sMaskSe
3e60: 74 3b 20 20 20 20 2f 2a 20 4d 61 70 20 63 75 72  t;    /* Map cur
3e70: 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62  sor numbers to b
3e80: 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65  itmasks */.  Whe
3e90: 72 65 43 6c 61 75 73 65 20 73 57 43 3b 20 20 20  reClause sWC;   
3ea0: 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70         /* Decomp
3eb0: 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 57  osition of the W
3ec0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
3ed0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
3ee0: 70 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ps;        /* Li
3ef0: 73 74 20 6f 66 20 61 6c 6c 20 57 68 65 72 65 4c  st of all WhereL
3f00: 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
3f10: 20 57 68 65 72 65 43 6f 73 74 20 73 61 76 65 64   WhereCost saved
3f20: 4e 51 75 65 72 79 4c 6f 6f 70 3b 20 2f 2a 20 70  NQueryLoop; /* p
3f30: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
3f40: 70 20 6f 75 74 73 69 64 65 20 74 68 65 20 57 48  p outside the WH
3f50: 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68  ERE loop */.  Wh
3f60: 65 72 65 43 6f 73 74 20 6e 52 6f 77 4f 75 74 3b  ereCost nRowOut;
3f70: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
3f80: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
3f90: 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20  utput rows */.  
3fa0: 57 68 65 72 65 4c 65 76 65 6c 20 61 5b 31 5d 3b  WhereLevel a[1];
3fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
3fc0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65  ormation about e
3fd0: 61 63 68 20 6e 65 73 74 20 6c 6f 6f 70 20 69 6e  ach nest loop in
3fe0: 20 57 48 45 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   WHERE */.};../*
3ff0: 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72  .** Bitmasks for
4000: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74   the operators t
4010: 68 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 20  hat indices are 
4020: 61 62 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e  able to exploit.
4030: 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f    An.** OR-ed co
4040: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
4050: 73 65 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65  se values can be
4060: 20 75 73 65 64 20 77 68 65 6e 20 73 65 61 72 63   used when searc
4070: 68 69 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d  hing for.** term
4080: 73 20 69 6e 20 74 68 65 20 77 68 65 72 65 20 63  s in the where c
4090: 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  lause..*/.#defin
40a0: 65 20 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30  e WO_IN     0x00
40b0: 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20  1.#define WO_EQ 
40c0: 20 20 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e      0x002.#defin
40d0: 65 20 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f  e WO_LT     (WO_
40e0: 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51  EQ<<(TK_LT-TK_EQ
40f0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45  )).#define WO_LE
4100: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
4110: 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _LE-TK_EQ)).#def
4120: 69 6e 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57  ine WO_GT     (W
4130: 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f  O_EQ<<(TK_GT-TK_
4140: 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f  EQ)).#define WO_
4150: 47 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  GE     (WO_EQ<<(
4160: 54 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_GE-TK_EQ)).#d
4170: 65 66 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20  efine WO_MATCH  
4180: 30 78 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f  0x040.#define WO
4190: 5f 49 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64  _ISNULL 0x080.#d
41a0: 65 66 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20  efine WO_OR     
41b0: 30 78 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54  0x100       /* T
41c0: 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f  wo or more OR-co
41d0: 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f  nnected terms */
41e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20  .#define WO_AND 
41f0: 20 20 20 30 78 32 30 30 20 20 20 20 20 20 20 2f     0x200       /
4200: 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e  * Two or more AN
4210: 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  D-connected term
4220: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  s */.#define WO_
4230: 45 51 55 49 56 20 20 30 78 34 30 30 20 20 20 20  EQUIV  0x400    
4240: 20 20 20 2f 2a 20 4f 66 20 74 68 65 20 66 6f 72     /* Of the for
4250: 6d 20 41 3d 3d 42 2c 20 62 6f 74 68 20 63 6f 6c  m A==B, both col
4260: 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  umns */.#define 
4270: 57 4f 5f 4e 4f 4f 50 20 20 20 30 78 38 30 30 20  WO_NOOP   0x800 
4280: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65        /* This te
4290: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 74  rm does not rest
42a0: 72 69 63 74 20 73 65 61 72 63 68 20 73 70 61 63  rict search spac
42b0: 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 57 4f  e */..#define WO
42c0: 5f 41 4c 4c 20 20 20 20 30 78 66 66 66 20 20 20  _ALL    0xfff   
42d0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
42e0: 6c 6c 20 70 6f 73 73 69 62 6c 65 20 57 4f 5f 2a  ll possible WO_*
42f0: 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69   values */.#defi
4300: 6e 65 20 57 4f 5f 53 49 4e 47 4c 45 20 30 78 30  ne WO_SINGLE 0x0
4310: 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  ff       /* Mask
4320: 20 6f 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70   of all non-comp
4330: 6f 75 6e 64 20 57 4f 5f 2a 20 76 61 6c 75 65 73  ound WO_* values
4340: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65   */../*.** Value
4350: 20 66 6f 72 20 77 73 46 6c 61 67 73 20 72 65 74   for wsFlags ret
4360: 75 72 6e 65 64 20 62 79 20 62 65 73 74 49 6e 64  urned by bestInd
4370: 65 78 28 29 20 61 6e 64 20 73 74 6f 72 65 64 20  ex() and stored 
4380: 69 6e 0a 2a 2a 20 57 68 65 72 65 4c 65 76 65 6c  in.** WhereLevel
4390: 2e 77 73 46 6c 61 67 73 2e 20 20 54 68 65 73 65  .wsFlags.  These
43a0: 20 66 6c 61 67 73 20 64 65 74 65 72 6d 69 6e 65   flags determine
43b0: 20 77 68 69 63 68 20 73 65 61 72 63 68 0a 2a 2a   which search.**
43c0: 20 73 74 72 61 74 65 67 69 65 73 20 61 72 65 20   strategies are 
43d0: 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
43e0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
43f0: 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30 30 30  LUMN_EQ    0x000
4400: 30 30 30 30 31 20 20 2f 2a 20 78 3d 45 58 50 52  00001  /* x=EXPR
4410: 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 6f   or x IN (...) o
4420: 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23  r x IS NULL */.#
4430: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
4440: 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30 30  UMN_RANGE 0x0000
4450: 30 30 30 32 20 20 2f 2a 20 78 3c 45 58 50 52 20  0002  /* x<EXPR 
4460: 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f  and/or x>EXPR */
4470: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
4480: 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30  OLUMN_IN    0x00
4490: 30 30 30 30 30 34 20 20 2f 2a 20 78 20 49 4e 20  000004  /* x IN 
44a0: 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65  (...) */.#define
44b0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
44c0: 4c 4c 20 20 30 78 30 30 30 30 30 30 30 38 20 20  LL  0x00000008  
44d0: 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a  /* x IS NULL */.
44e0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
44f0: 4e 53 54 52 41 49 4e 54 20 20 20 30 78 30 30 30  NSTRAINT   0x000
4500: 30 30 30 30 66 20 20 2f 2a 20 41 6e 79 20 6f 66  0000f  /* Any of
4510: 20 74 68 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d   the WHERE_COLUM
4520: 4e 5f 78 78 78 20 76 61 6c 75 65 73 20 2a 2f 0a  N_xxx values */.
4530: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f  #define WHERE_TO
4540: 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 30  P_LIMIT    0x000
4550: 30 30 30 31 30 20 20 2f 2a 20 78 3c 45 58 50 52  00010  /* x<EXPR
4560: 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73   or x<=EXPR cons
4570: 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e  traint */.#defin
4580: 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  e WHERE_BTM_LIMI
4590: 54 20 20 20 20 30 78 30 30 30 30 30 30 32 30 20  T    0x00000020 
45a0: 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e   /* x>EXPR or x>
45b0: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
45c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
45d0: 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20 30  E_BOTH_LIMIT   0
45e0: 78 30 30 30 30 30 30 33 30 20 20 2f 2a 20 42 6f  x00000030  /* Bo
45f0: 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78 3c  th x>EXPR and x<
4600: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
4610: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20  WHERE_IDX_ONLY  
4620: 20 20 20 30 78 30 30 30 30 30 30 34 30 20 20 2f     0x00000040  /
4630: 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79  * Use index only
4640: 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f   - omit table */
4650: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49  .#define WHERE_I
4660: 50 4b 20 20 20 20 20 20 20 20 20 20 30 78 30 30  PK          0x00
4670: 30 30 30 31 30 30 20 20 2f 2a 20 78 20 69 73 20  000100  /* x is 
4680: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
4690: 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65 66 69  ARY KEY */.#defi
46a0: 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44  ne WHERE_INDEXED
46b0: 20 20 20 20 20 20 30 78 30 30 30 30 30 32 30 30        0x00000200
46c0: 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75    /* WhereLoop.u
46d0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 69 73  .btree.pIndex is
46e0: 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69 6e   valid */.#defin
46f0: 65 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  e WHERE_VIRTUALT
4700: 41 42 4c 45 20 30 78 30 30 30 30 30 34 30 30 20  ABLE 0x00000400 
4710: 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e   /* WhereLoop.u.
4720: 76 74 61 62 20 69 73 20 76 61 6c 69 64 20 2a 2f  vtab is valid */
4730: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49  .#define WHERE_I
4740: 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30 30  N_ABLE      0x00
4750: 30 30 30 38 30 30 20 20 2f 2a 20 41 62 6c 65 20  000800  /* Able 
4760: 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49 4e  to support an IN
4770: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65   operator */.#de
4780: 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f  fine WHERE_ONERO
4790: 57 20 20 20 20 20 20 20 30 78 30 30 30 30 31 30  W       0x000010
47a0: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
47b0: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
47c0: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
47d0: 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20  HERE_MULTI_OR   
47e0: 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f 2a    0x00002000  /*
47f0: 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69 70   OR using multip
4800: 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23 64  le indices */.#d
4810: 65 66 69 6e 65 20 57 48 45 52 45 5f 54 45 4d 50  efine WHERE_TEMP
4820: 5f 49 4e 44 45 58 20 20 20 30 78 30 30 30 30 34  _INDEX   0x00004
4830: 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e 20  000  /* Uses an 
4840: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
4850: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
4860: 5f 43 4f 56 45 52 5f 53 43 41 4e 20 20 20 30 78  _COVER_SCAN   0x
4870: 30 30 30 30 38 30 30 30 20 20 2f 2a 20 46 75 6c  00008000  /* Ful
4880: 6c 20 73 63 61 6e 20 6f 66 20 61 20 63 6f 76 65  l scan of a cove
4890: 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f  ring index */../
48a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
48b0: 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
48c0: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
48d0: 66 72 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61  from a WHERE cla
48e0: 75 73 65 0a 2a 2f 0a 64 6f 75 62 6c 65 20 73 71  use.*/.double sq
48f0: 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
4900: 52 6f 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e  RowCount(WhereIn
4910: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
4920: 65 74 75 72 6e 20 28 64 6f 75 62 6c 65 29 70 57  eturn (double)pW
4930: 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 7d  Info->nRowOut;.}
4940: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f  ../*.** Return o
4950: 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
4960: 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78 20 76  DISTINCT_xxxxx v
4970: 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63 61 74  alues to indicat
4980: 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20 57 48  e how this.** WH
4990: 45 52 45 20 63 6c 61 75 73 65 20 72 65 74 75 72  ERE clause retur
49a0: 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72 20 44  ns outputs for D
49b0: 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
49c0: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
49d0: 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
49e0: 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  t(WhereInfo *pWI
49f0: 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  nfo){.  return p
4a00: 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
4a10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4a20: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48  n TRUE if the WH
4a30: 45 52 45 20 63 6c 61 75 73 65 20 72 65 74 75 72  ERE clause retur
4a40: 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44 45 52  ns rows in ORDER
4a50: 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20 52 65   BY order..** Re
4a60: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
4a70: 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73 20 74  e output needs t
4a80: 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2f 0a  o be sorted..*/.
4a90: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
4aa0: 49 73 4f 72 64 65 72 65 64 28 57 68 65 72 65 49  IsOrdered(WhereI
4ab0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
4ac0: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e  return pWInfo->n
4ad0: 4f 42 53 61 74 3e 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  OBSat>0;.}../*.*
4ae0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
4af0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
4b00: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
4b10: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
4b20: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
4b30: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
4b40: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
4b50: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
4b60: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
4b70: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
4b80: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
4b90: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  turn pWInfo->iCo
4ba0: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
4bb0: 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42 45   Return the VDBE
4bc0: 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62 65   address or labe
4bd0: 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e 20  l to jump to in 
4be0: 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b 0a 2a  order to break.*
4bf0: 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45 52 45  * out of a WHERE
4c00: 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
4c10: 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
4c20: 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f 20 2a  abel(WhereInfo *
4c30: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
4c40: 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  n pWInfo->iBreak
4c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4c60: 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55 50 44  n TRUE if an UPD
4c70: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
4c80: 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70 65 72  atement can oper
4c90: 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 0a  ate directly on.
4ca0: 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20 72 65  ** the rowids re
4cb0: 74 75 72 6e 65 64 20 62 79 20 61 20 57 48 45 52  turned by a WHER
4cc0: 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74 75 72  E clause.  Retur
4cd0: 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69 6e 67  n FALSE if doing
4ce0: 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72   an.** UPDATE or
4cf0: 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20 63 68   DELETE might ch
4d00: 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e 74 20  ange subsequent 
4d10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 73  WHERE clause res
4d20: 75 6c 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ults..*/.int sql
4d30: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
4d40: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
4d50: 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  Info){.  return 
4d60: 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
4d70: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  s;.}../*.** Init
4d80: 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f  ialize a preallo
4d90: 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73  cated WhereClaus
4da0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
4db0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
4dc0: 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57  eClauseInit(.  W
4dd0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
4de0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
4df0: 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65  hereClause to be
4e00: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
4e10: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
4e20: 6e 66 6f 20 20 20 20 20 20 20 20 2f 2a 20 54 68  nfo        /* Th
4e30: 65 20 57 48 45 52 45 20 70 72 6f 63 65 73 73 69  e WHERE processi
4e40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
4e50: 0a 20 20 70 57 43 2d 3e 70 57 49 6e 66 6f 20 3d  .  pWC->pWInfo =
4e60: 20 70 57 49 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e   pWInfo;.  pWC->
4e70: 70 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20 70 57  pOuter = 0;.  pW
4e80: 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20  C->nTerm = 0;.  
4e90: 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72  pWC->nSlot = Arr
4ea0: 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61  aySize(pWC->aSta
4eb0: 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d  tic);.  pWC->a =
4ec0: 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d   pWC->aStatic;.}
4ed0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
4ee0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
4ef0: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
4f00: 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75  eClear(WhereClau
4f10: 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  se*);../*.** Dea
4f20: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
4f30: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
4f40: 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f  th a WhereOrInfo
4f50: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
4f60: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49  ic void whereOrI
4f70: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
4f80: 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e  3 *db, WhereOrIn
4f90: 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43  fo *p){.  whereC
4fa0: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77  lauseClear(&p->w
4fb0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
4fc0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
4fd0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
4fe0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
4ff0: 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65  iated with a Whe
5000: 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74  reAndInfo object
5010: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5020: 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c   whereAndInfoDel
5030: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
5040: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
5050: 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  ){.  whereClause
5060: 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20  Clear(&p->wc);. 
5070: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5080: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
5090: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65  Deallocate a Whe
50a0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
50b0: 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  re.  The WhereCl
50c0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
50d0: 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20  * itself is not 
50e0: 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75  freed.  This rou
50f0: 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65  tine is the inve
5100: 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75  rse of whereClau
5110: 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  seInit()..*/.sta
5120: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
5130: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
5140: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
5150: 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
5160: 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20  m *a;.  sqlite3 
5170: 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  *db = pWC->pWInf
5180: 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
5190: 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
51a0: 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69  m-1, a=pWC->a; i
51b0: 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a  >=0; i--, a++){.
51c0: 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61      if( a->wtFla
51d0: 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49  gs & TERM_DYNAMI
51e0: 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  C ){.      sqlit
51f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5200: 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20   a->pExpr);.    
5210: 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46  }.    if( a->wtF
5220: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
5230: 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  FO ){.      wher
5240: 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  eOrInfoDelete(db
5250: 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b  , a->u.pOrInfo);
5260: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61  .    }else if( a
5270: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
5280: 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _ANDINFO ){.    
5290: 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65    whereAndInfoDe
52a0: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41  lete(db, a->u.pA
52b0: 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  ndInfo);.    }. 
52c0: 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21   }.  if( pWC->a!
52d0: 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b  =pWC->aStatic ){
52e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
52f0: 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a  ee(db, pWC->a);.
5300: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
5310: 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57 68   a single new Wh
5320: 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74 6f  ereTerm entry to
5330: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
5340: 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20   object pWC..** 
5350: 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  The new WhereTer
5360: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 73  m object is cons
5370: 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78 70  tructed from Exp
5380: 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74 46  r p and with wtF
5390: 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e 64  lags..** The ind
53a0: 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f  ex in pWC->a[] o
53b0: 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54  f the new WhereT
53c0: 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64 20  erm is returned 
53d0: 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 30  on success..** 0
53e0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
53f0: 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  the new WhereTer
5400: 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61  m could not be a
5410: 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d 65  dded due to a me
5420: 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  mory.** allocati
5430: 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6d  on error.  The m
5440: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
5450: 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62 65   failure will be
5460: 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a 20   recorded in.** 
5470: 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  the db->mallocFa
5480: 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61  iled flag so tha
5490: 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 66  t higher-level f
54a0: 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65 74  unctions can det
54b0: 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ect it..**.** Th
54c0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
54d0: 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  increase the siz
54e0: 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61 5b  e of the pWC->a[
54f0: 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73  ] array as neces
5500: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sary..**.** If t
5510: 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75 6d  he wtFlags argum
5520: 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52  ent includes TER
5530: 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  M_DYNAMIC, then 
5540: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
5550: 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  * for freeing th
5560: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69  e expression p i
5570: 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68 65  s assumed by the
5580: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
5590: 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69 73  ect pWC..** This
55a0: 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69 66   is true even if
55b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
55c0: 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ils to allocate 
55d0: 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 2e  a new WhereTerm.
55e0: 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  .**.** WARNING: 
55f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
5600: 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74  ght reallocate t
5610: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  he space used to
5620: 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54   store.** WhereT
5630: 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74  erms.  All point
5640: 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d  ers to WhereTerm
5650: 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61  s should be inva
5660: 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a 2a  lidated after.**
5670: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
5680: 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69  utine.  Such poi
5690: 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65 69  nters may be rei
56a0: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65  nitialized by re
56b0: 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65  ferencing.** the
56c0: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e   pWC->a[] array.
56d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
56e0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
56f0: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
5700: 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20 77  C, Expr *p, u8 w
5710: 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65  tFlags){.  Where
5720: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
5730: 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74 63 61  nt idx;.  testca
5740: 73 65 28 20 77 74 46 6c 61 67 73 20 26 20 54 45  se( wtFlags & TE
5750: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20 2f  RM_VIRTUAL );  /
5760: 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35  * EV: R-00211-15
5770: 31 30 30 20 2a 2f 0a 20 20 69 66 28 20 70 57 43  100 */.  if( pWC
5780: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
5790: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
57a0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
57b0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
57c0: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
57d0: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
57e0: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
57f0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
5800: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
5810: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
5820: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
5830: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
5840: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
5850: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
5860: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5870: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
5880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5890: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
58a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
58b0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
58c0: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
58d0: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
58e0: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
58f0: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
5900: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
5910: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5920: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
5930: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
5940: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
5950: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
5960: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
5970: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
5980: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
5990: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
59a0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73  pTerm->pExpr = s
59b0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
59c0: 6c 6c 61 74 65 28 70 29 3b 0a 20 20 70 54 65 72  llate(p);.  pTer
59d0: 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46  m->wtFlags = wtF
59e0: 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  lags;.  pTerm->p
59f0: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72  WC = pWC;.  pTer
5a00: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
5a10: 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d  .  return idx;.}
5a20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5a30: 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20  tine identifies 
5a40: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69  subexpressions i
5a50: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
5a60: 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68  se where.** each
5a70: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
5a80: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74  s separated by t
5a90: 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
5aa0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
5ab0: 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69 66   operator specif
5ac0: 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61  ied in the op pa
5ad0: 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68  rameter.  The Wh
5ae0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
5af0: 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64  ure.** is filled
5b00: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
5b10: 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  o subexpressions
5b20: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
5b30: 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20  **.**    WHERE  
5b40: 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63  a=='hello' AND c
5b50: 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30  oalesce(b,11)<10
5b60: 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52   AND (c+12!=d OR
5b70: 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20   c==22).**      
5b80: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20       \________/ 
5b90: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
5ba0: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
5bb0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
5bc0: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
5bd0: 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73 6c  0]            sl
5be0: 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20  ot[1]           
5bf0: 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a      slot[2].**.*
5c00: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  * The original W
5c10: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70  HERE clause in p
5c20: 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65  Expr is unaltere
5c30: 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  d.  All this rou
5c40: 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20  tine.** does is 
5c50: 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72  make slot[] entr
5c60: 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62  ies point to sub
5c70: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69 6e  structure within
5c80: 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e   pExpr..**.** In
5c90: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
5ca0: 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68  ntence and in th
5cb0: 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74  e diagram, "slot
5cc0: 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a  []" refers to.**
5cd0: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
5ce0: 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65  .a[] array.  The
5cf0: 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72   slot[] array gr
5d00: 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f  ows as needed to
5d10: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20   contain.** all 
5d20: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
5d30: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  RE clause..*/.st
5d40: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53  atic void whereS
5d50: 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65  plit(WhereClause
5d60: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78   *pWC, Expr *pEx
5d70: 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 70  pr, int op){.  p
5d80: 57 43 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b  WC->op = (u8)op;
5d90: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
5da0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5db0: 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b  pExpr->op!=op ){
5dc0: 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
5dd0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78 70  Insert(pWC, pExp
5de0: 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r, 0);.  }else{.
5df0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
5e00: 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  WC, pExpr->pLeft
5e10: 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65  , op);.    where
5e20: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
5e30: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20  ->pRight, op);. 
5e40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
5e50: 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73  ialize an expres
5e60: 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28 61  sion mask set (a
5e70: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62   WhereMaskSet ob
5e80: 6a 65 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  ject).*/.#define
5e90: 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20   initMaskSet(P) 
5ea0: 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20 73 69   memset(P, 0, si
5eb0: 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a  zeof(*P))../*.**
5ec0: 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d   Return the bitm
5ed0: 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65  ask for the give
5ee0: 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e  n cursor number.
5ef0: 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a    Return 0 if.**
5f00: 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20   iCursor is not 
5f10: 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73  in the set..*/.s
5f20: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65  tatic Bitmask ge
5f30: 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53  tMask(WhereMaskS
5f40: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e  et *pMaskSet, in
5f50: 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e  t iCursor){.  in
5f60: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
5f70: 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74  MaskSet->n<=(int
5f80: 29 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29  )sizeof(Bitmask)
5f90: 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  *8 );.  for(i=0;
5fa0: 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20   i<pMaskSet->n; 
5fb0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d  i++){.    if( pM
5fc0: 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69  askSet->ix[i]==i
5fd0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
5fe0: 72 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69  return MASKBIT(i
5ff0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
6000: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
6010: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d  * Create a new m
6020: 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69  ask for cursor i
6030: 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cursor..**.** Th
6040: 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f  ere is one curso
6050: 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74  r per table in t
6060: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
6070: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   The number of.*
6080: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
6090: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
60a0: 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74  imited by a test
60b0: 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a   early in the.**
60c0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
60d0: 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  in() routine.  S
60e0: 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
60f0: 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  he pMaskSet->ix[
6100: 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20  ].** array will 
6110: 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a  never overflow..
6120: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
6130: 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d  reateMask(WhereM
6140: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
6150: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
6160: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
6170: 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a  et->n < ArraySiz
6180: 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20  e(pMaskSet->ix) 
6190: 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69  );.  pMaskSet->i
61a0: 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d  x[pMaskSet->n++]
61b0: 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f   = iCursor;.}../
61c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
61d0: 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69  e walks (recursi
61e0: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
61f0: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
6200: 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d  erates.** a bitm
6210: 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77  ask indicating w
6220: 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
6230: 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70  used in that exp
6240: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e  ression.** tree.
6250: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
6260: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
6270: 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61   to work, the ca
6280: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d  lling function m
6290: 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76  ust have.** prev
62a0: 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73  iously invoked s
62b0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
62c0: 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20  rNames() on the 
62d0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65  expression.  See
62e0: 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 63  .** the header c
62f0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
6300: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
6310: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
6320: 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  n..** The sqlite
6330: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
6340: 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f  s() routines loo
6350: 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61  ks for column na
6360: 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20  mes and.** sets 
6370: 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f  their opcodes to
6380: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
6390: 68 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65  heir Expr.iTable
63a0: 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68   fields to.** th
63b0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
63c0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
63d0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
63e0: 20 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20   just has to.** 
63f0: 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75  translate the cu
6400: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
6410: 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  o bitmask values
6420: 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74   and OR all.** t
6430: 68 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65  he bitmasks toge
6440: 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
6450: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
6460: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
6470: 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69  MaskSet*, ExprLi
6480: 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  st*);.static Bit
6490: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
64a0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
64b0: 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a  askSet*, Select*
64c0: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
64d0: 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  k exprTableUsage
64e0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
64f0: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70  MaskSet, Expr *p
6500: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
6510: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  k = 0;.  if( p==
6520: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6530: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
6540: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b  LUMN ){.    mask
6550: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
6560: 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b  Set, p->iTable);
6570: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b  .    return mask
6580: 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65  ;.  }.  mask = e
6590: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
65a0: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68  askSet, p->pRigh
65b0: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
65c0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
65d0: 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29  skSet, p->pLeft)
65e0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
65f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
6600: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
6610: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
6620: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
6630: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c  skSet, p->x.pSel
6640: 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ect);.  }else{. 
6650: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
6660: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
6670: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69  askSet, p->x.pLi
6680: 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
6690: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
66a0: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
66b0: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
66c0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
66d0: 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  et, ExprList *pL
66e0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
66f0: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
6700: 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
6710: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
6720: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
6730: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++){.      mask 
6740: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
6750: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
6760: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
6770: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6780: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
6790: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
67a0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57  lectTableUsage(W
67b0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
67c0: 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70  skSet, Select *p
67d0: 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  S){.  Bitmask ma
67e0: 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  sk = 0;.  while(
67f0: 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69   pS ){.    SrcLi
6800: 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70  st *pSrc = pS->p
6810: 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  Src;.    mask |=
6820: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
6830: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
6840: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
6850: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
6860: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
6870: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
6880: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
6890: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
68a0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
68b0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
68c0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
68d0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
68e0: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
68f0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
6900: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
6910: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
6920: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
6930: 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Src!=0) ){.     
6940: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
6950: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
6960: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
6970: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
6980: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
6990: 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e  pMaskSet, pSrc->
69a0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
69b0: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
69c0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
69d0: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
69e0: 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d  i].pOn);.      }
69f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20  .    }.    pS = 
6a00: 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  pS->pPrior;.  }.
6a10: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
6a20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
6a30: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
6a40: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
6a50: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
6a60: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
6a70: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
6a80: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
6a90: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
6aa0: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
6ab0: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
6ac0: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
6ad0: 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a  , and "IN"..**.*
6ae0: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
6af0: 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32 36 33  -OF: R-59926-263
6b00: 39 33 20 54 6f 20 62 65 20 75 73 61 62 6c 65 20  93 To be usable 
6b10: 62 79 20 61 6e 20 69 6e 64 65 78 20 61 20 74 65  by an index a te
6b20: 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f 66  rm must be.** of
6b30: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
6b40: 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f 6c  owing forms: col
6b50: 75 6d 6e 20 3d 20 65 78 70 72 65 73 73 69 6f 6e  umn = expression
6b60: 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65 73   column > expres
6b70: 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e  sion.** column >
6b80: 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  = expression col
6b90: 75 6d 6e 20 3c 20 65 78 70 72 65 73 73 69 6f 6e  umn < expression
6ba0: 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72 65   column <= expre
6bb0: 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73 73  ssion.** express
6bc0: 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78 70  ion = column exp
6bd0: 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e  ression > column
6be0: 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20 63   expression >= c
6bf0: 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73 73  olumn.** express
6c00: 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78 70  ion < column exp
6c10: 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d  ression <= colum
6c20: 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28  n column IN.** (
6c30: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 29  expression-list)
6c40: 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62 71   column IN (subq
6c50: 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53 20  uery) column IS 
6c60: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
6c70: 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74  nt allowedOp(int
6c80: 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   op){.  assert( 
6c90: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_GT>TK_EQ && T
6ca0: 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_GT<TK_GE );.  
6cb0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b  assert( TK_LT>TK
6cc0: 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f  _EQ && TK_LT<TK_
6cd0: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
6ce0: 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LE>TK_EQ && T
6cf0: 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LE<TK_GE );.  
6d00: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
6d10: 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75  K_EQ+4 );.  retu
6d20: 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  rn op==TK_IN || 
6d30: 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70  (op>=TK_EQ && op
6d40: 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d  <=TK_GE) || op==
6d50: 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a  TK_ISNULL;.}../*
6d60: 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a  .** Swap two obj
6d70: 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50  ects of type TYP
6d80: 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  E..*/.#define SW
6d90: 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59  AP(TYPE,A,B) {TY
6da0: 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74  PE t=A; A=B; B=t
6db0: 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74  ;}../*.** Commut
6dc0: 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  e a comparison o
6dd0: 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73  perator.  Expres
6de0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
6df0: 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72  m "X op Y".** ar
6e00: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
6e10: 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a   "Y op X"..**.**
6e20: 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20 70   If left/right p
6e30: 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73 20  recedence rules 
6e40: 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20 77  come into play w
6e50: 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  hen determining 
6e60: 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  the.** collating
6e70: 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20  .** side of the 
6e80: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72  comparison, it r
6e90: 65 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65  emains associate
6ea0: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
6eb0: 73 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  side after.** th
6ec0: 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53  e commutation. S
6ed0: 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43  o "Y collate NOC
6ee0: 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65  ASE op X" become
6ef0: 73 20 0a 2a 2a 20 22 58 20 6f 70 20 59 22 2e 20  s .** "X op Y". 
6f00: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
6f10: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
6f20: 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65  quence on.** the
6f30: 20 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20   left hand side 
6f40: 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  of a comparison 
6f50: 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f  overrides any co
6f60: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
6f70: 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f   .** attached to
6f80: 20 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20   the right. For 
6f90: 74 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20  the same reason 
6fa0: 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66  the EP_Collate f
6fb0: 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  lag.** is not co
6fc0: 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mmuted..*/.stati
6fd0: 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75  c void exprCommu
6fe0: 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  te(Parse *pParse
6ff0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
7000: 20 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d    u16 expRight =
7010: 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d   (pExpr->pRight-
7020: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
7030: 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c  ate);.  u16 expL
7040: 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c  eft = (pExpr->pL
7050: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
7060: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65  Collate);.  asse
7070: 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45  rt( allowedOp(pE
7080: 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70  xpr->op) && pExp
7090: 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a  r->op!=TK_IN );.
70a0: 20 20 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d    if( expRight==
70b0: 65 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f  expLeft ){.    /
70c0: 2a 20 45 69 74 68 65 72 20 58 20 61 6e 64 20 59  * Either X and Y
70d0: 20 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41   both have COLLA
70e0: 54 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e  TE operator or n
70f0: 65 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20  either do */.   
7100: 20 69 66 28 20 65 78 70 52 69 67 68 74 20 29 7b   if( expRight ){
7110: 0a 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58  .      /* Both X
7120: 20 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c   and Y have COLL
7130: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20  ATE operators.  
7140: 4d 61 6b 65 20 73 75 72 65 20 58 20 69 73 20 61  Make sure X is a
7150: 6c 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75  lways.      ** u
7160: 73 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20  sed by clearing 
7170: 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66  the EP_Collate f
7180: 6c 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20  lag from Y. */. 
7190: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
71a0: 68 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50  ht->flags &= ~EP
71b0: 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65  _Collate;.    }e
71c0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 45  lse if( sqlite3E
71d0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
71e0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
71f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
7200: 4e 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20  Neither X nor Y 
7210: 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65  have COLLATE ope
7220: 72 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61  rators, but X ha
7230: 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a  s a non-default.
7240: 20 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69        ** collati
7250: 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f  ng sequence.  So
7260: 20 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c   add the EP_Coll
7270: 61 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20  ate marker on X 
7280: 74 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a  to cause.      *
7290: 2a 20 69 74 20 74 6f 20 62 65 20 73 65 61 72 63  * it to be searc
72a0: 68 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20  hed first. */.  
72b0: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
72c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f  ->flags |= EP_Co
72d0: 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  llate;.    }.  }
72e0: 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45  .  SWAP(Expr*,pE
72f0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70  xpr->pRight,pExp
7300: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
7310: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
7320: 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
7330: 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
7340: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  );.    assert( T
7350: 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b  K_GE==TK_LE+2 );
7360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
7370: 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  GT>TK_EQ );.    
7380: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b  assert( TK_GT<TK
7390: 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
73a0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b  t( pExpr->op>=TK
73b0: 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _GT && pExpr->op
73c0: 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70  <=TK_GE );.    p
73d0: 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78  Expr->op = ((pEx
73e0: 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29  pr->op-TK_GT)^2)
73f0: 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f  +TK_GT;.  }.}../
7400: 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66  *.** Translate f
7410: 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74  rom TK_xx operat
7420: 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d  or to WO_xx bitm
7430: 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ask..*/.static u
7440: 31 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28  16 operatorMask(
7450: 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63  int op){.  u16 c
7460: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f  ;.  assert( allo
7470: 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69  wedOp(op) );.  i
7480: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
7490: 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20      c = WO_IN;. 
74a0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
74b0: 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
74c0: 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20  c = WO_ISNULL;. 
74d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
74e0: 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d  rt( (WO_EQ<<(op-
74f0: 54 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66  TK_EQ)) < 0x7fff
7500: 20 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36   );.    c = (u16
7510: 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f  )(WO_EQ<<(op-TK_
7520: 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  EQ));.  }.  asse
7530: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  rt( op!=TK_ISNUL
7540: 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c  L || c==WO_ISNUL
7550: 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  L );.  assert( o
7560: 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57  p!=TK_IN || c==W
7570: 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  O_IN );.  assert
7580: 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63  ( op!=TK_EQ || c
7590: 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73  ==WO_EQ );.  ass
75a0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c  ert( op!=TK_LT |
75b0: 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20  | c==WO_LT );.  
75c0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
75d0: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b  E || c==WO_LE );
75e0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
75f0: 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54  K_GT || c==WO_GT
7600: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
7610: 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GE || c==WO
7620: 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _GE );.  return 
7630: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  c;.}../*.** Adva
7640: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
7650: 57 68 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d  WhereTerm that m
7660: 61 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67  atches according
7670: 20 74 6f 20 74 68 65 20 63 72 69 74 65 72 69 61   to the criteria
7680: 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20  .** established 
7690: 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f  when the pScan o
76a0: 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69 61  bject was initia
76b0: 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65 53 63  lized by whereSc
76c0: 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74  anInit()..** Ret
76d0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
76e0: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61  e are no more ma
76f0: 74 63 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d  tching WhereTerm
7700: 73 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20  s..*/.WhereTerm 
7710: 2a 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57  *whereScanNext(W
7720: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29  hereScan *pScan)
7730: 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  {.  int iCur;   
7740: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7750: 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48  cursor on the LH
7760: 53 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f  S of the term */
7770: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
7780: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
7790: 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53  olumn on the LHS
77a0: 20 6f 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d   of the term.  -
77b0: 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45  1 for IPK */.  E
77c0: 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
77d0: 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
77e0: 73 69 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65  sion being teste
77f0: 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
7800: 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53  se *pWC;    /* S
7810: 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63  horthand for pSc
7820: 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65  an->pWC */.  Whe
7830: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
7840: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65    /* The term be
7850: 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 0a 20  ing tested */.. 
7860: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
7870: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
7880: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
7890: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
78a0: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
78b0: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
78c0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
78d0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
78e0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
78f0: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
7900: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
7910: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 70 53 63 61  Term=pWC->a+pSca
7920: 6e 2d 3e 6b 3b 20 70 53 63 61 6e 2d 3e 6b 3c 70  n->k; pScan->k<p
7930: 57 43 2d 3e 6e 54 65 72 6d 3b 20 70 53 63 61 6e  WC->nTerm; pScan
7940: 2d 3e 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ->k++, pTerm++){
7950: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
7960: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
7970: 69 43 75 72 20 26 26 20 70 54 65 72 6d 2d 3e 75  iCur && pTerm->u
7980: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
7990: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
79a0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
79b0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
79c0: 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  IV)!=0.         
79d0: 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75    && pScan->nEqu
79e0: 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63  iv<ArraySize(pSc
79f0: 61 6e 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20  an->aEquiv).    
7a00: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
7a10: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
7a20: 20 20 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c          pX = sql
7a30: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
7a40: 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  ate(pTerm->pExpr
7a50: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
7a60: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7a70: 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  X->op==TK_COLUMN
7a80: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
7a90: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e  for(j=0; j<pScan
7aa0: 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b  ->nEquiv; j+=2){
7ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
7ac0: 66 28 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  f( pScan->aEquiv
7ad0: 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a  [j]==pX->iTable.
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
7af0: 26 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  & pScan->aEquiv[
7b00: 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d  j+1]==pX->iColum
7b10: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
7b20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7b40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7b50: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70          if( j==p
7b60: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a  Scan->nEquiv ){.
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
7b80: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d  can->aEquiv[j] =
7b90: 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
7ba0: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
7bb0: 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20  ->aEquiv[j+1] = 
7bc0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pX->iColumn;.   
7bd0: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
7be0: 2d 3e 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20  ->nEquiv += 2;. 
7bf0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7c00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7c10: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
7c20: 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e  Operator & pScan
7c30: 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a  ->opMask)!=0 ){.
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7c50: 65 72 69 66 79 20 74 68 65 20 61 66 66 69 6e 69  erify the affini
7c60: 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  ty and collating
7c70: 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20   sequence match 
7c80: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
7c90: 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e  f( pScan->zCollN
7ca0: 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65  ame && (pTerm->e
7cb0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
7cc0: 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
7cd0: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
7ce0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
7cf0: 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70          Parse *p
7d00: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49  Parse = pWC->pWI
7d10: 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  nfo->pParse;.   
7d20: 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20             pX = 
7d30: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7d50: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
7d60: 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61  inityOk(pX, pSca
7d70: 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20  n->idxaff) ){.  
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7d90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7db0: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d        assert(pX-
7dc0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
7dd0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
7de0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
7df0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
7e00: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e30: 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20       pX->pLeft, 
7e40: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
7e50: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7e60: 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
7e70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
7e80: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
7e90: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
7ea0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
7eb0: 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a  >zName, pScan->z
7ec0: 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  CollName) ){.   
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7ee0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7f00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7f10: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
7f20: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 21  erator & WO_EQ)!
7f30: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
7f40: 26 26 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e  && (pX = pTerm->
7f50: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e  pExpr->pRight)->
7f60: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
7f70: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58             && pX
7f80: 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d  ->iTable==pScan-
7f90: 3e 61 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20  >aEquiv[0].     
7fa0: 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69          && pX->i
7fb0: 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61  Column==pScan->a
7fc0: 45 71 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20  Equiv[1].       
7fd0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
7fe0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8000: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
8010: 3e 70 43 75 72 72 65 6e 74 20 3d 20 70 54 65 72  >pCurrent = pTer
8020: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  m;.            p
8030: 53 63 61 6e 2d 3e 6b 2b 2b 3b 0a 20 20 20 20 20  Scan->k++;.     
8040: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54         return pT
8050: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  erm;.          }
8060: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8070: 20 7d 0a 20 20 20 20 20 20 70 57 43 20 3d 20 70   }.      pWC = p
8080: 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61  Scan->pWC = pSca
8090: 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a  n->pWC->pOuter;.
80a0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d        pScan->k =
80b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
80c0: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e  can->pWC = pScan
80d0: 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 70  ->pOrigWC;.    p
80e0: 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 20  Scan->k = 0;.   
80f0: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b   pScan->iEquiv +
8100: 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e  = 2;.  }.  pScan
8110: 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a  ->pCurrent = 0;.
8120: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
8130: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
8140: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
8150: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
8160: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
8170: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
8180: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
8190: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
81a0: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
81b0: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
81c0: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
81d0: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
81e0: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
81f0: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
8200: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
8210: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
8220: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
8230: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
8240: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20  e.** iCur.  The 
8250: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
8260: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
8270: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
8280: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
8290: 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54  X is not the INT
82a0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
82b0: 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20   then X must be 
82c0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a  compatible with.
82d0: 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  ** index pIdx..*
82e0: 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65  /.WhereTerm *whe
82f0: 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68  reScanInit(.  Wh
8300: 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20  ereScan *pScan, 
8310: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
8320: 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65  reScan object be
8330: 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ing initialized 
8340: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
8350: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20   *pWC,       /* 
8360: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
8370: 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
8380: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
8390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
83a0: 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f  ursor to scan fo
83b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  r */.  int iColu
83c0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
83d0: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e  * Column to scan
83e0: 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70   for */.  u32 op
83f0: 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Mask,           
8400: 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29    /* Operator(s)
8410: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
8420: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
8430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
8440: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
8450: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20  with this index 
8460: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a  */.){.  int j;..
8470: 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63 61    /* memset(pSca
8480: 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  n, 0, sizeof(*pS
8490: 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61  can)); */.  pSca
84a0: 6e 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 30 3b  n->pCurrent = 0;
84b0: 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57  .  pScan->pOrigW
84c0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e  C = pWC;.  pScan
84d0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 69  ->pWC = pWC;.  i
84e0: 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75  f( pIdx && iColu
84f0: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63  mn>=0 ){.    pSc
8500: 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64  an->idxaff = pId
8510: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
8520: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
8530: 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  y;.    for(j=0; 
8540: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
8550: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  ]!=iColumn; j++)
8560: 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45  {.      if( NEVE
8570: 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  R(j>=pIdx->nColu
8580: 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  mn) ) return 0;.
8590: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
85a0: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
85b0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
85c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e  }else{.    pScan
85d0: 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20  ->idxaff = 0;.  
85e0: 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61    pScan->zCollNa
85f0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  me = 0;.  }.  pS
8600: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70  can->opMask = op
8610: 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b  Mask;.  pScan->k
8620: 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61   = 0;.  pScan->a
8630: 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b  Equiv[0] = iCur;
8640: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
8650: 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  [1] = iColumn;. 
8660: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d   pScan->nEquiv =
8670: 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71   2;.  pScan->iEq
8680: 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72  uiv = 2;.  retur
8690: 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  n whereScanNext(
86a0: 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pScan);.}../*.**
86b0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
86c0: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
86d0: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
86e0: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
86f0: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
8700: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
8710: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
8720: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
8730: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
8740: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
8750: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
8760: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
8770: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
8780: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
8790: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
87a0: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
87b0: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  t found..**.** T
87c0: 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64  he term returned
87d0: 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70   might by Y=<exp
87e0: 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61  r> if there is a
87f0: 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e  nother constrain
8800: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  t in.** the WHER
8810: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70  E clause that sp
8820: 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59  ecifies that X=Y
8830: 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73  .  Any such cons
8840: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a  traints will be.
8850: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
8860: 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69   the WO_EQUIV bi
8870: 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e  t in the pTerm->
8880: 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e  eOperator field.
8890: 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b    The.** aEquiv[
88a0: 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20  ] array holds X 
88b0: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
88c0: 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61  valents, with ea
88d0: 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a  ch SQL variable.
88e0: 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f  ** taking up two
88f0: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
8900: 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73  [].  The first s
8910: 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63  lot is for the c
8920: 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20  ursor number.** 
8930: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69  and the second i
8940: 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  s for the column
8950: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20   number.  There 
8960: 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20  are 22 slots in 
8970: 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74  aEquiv[].** so t
8980: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
8990: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
89a0: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
89b0: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
89c0: 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65  s..** Hence a se
89d0: 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20  arch for X will 
89e0: 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66  return <expr> if
89f0: 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20   X=A1 and A1=A2 
8a00: 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64  and A2=A3.** and
8a10: 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20   ... and A9=A10 
8a20: 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a  and A10=<expr>..
8a30: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
8a40: 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  re multiple term
8a50: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
8a60: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
8a70: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
8a80: 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f  ".** then try fo
8a90: 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e  r the one with n
8aa0: 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  o dependencies o
8ab0: 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74  n <expr> - in ot
8ac0: 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a  her words where.
8ad0: 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  ** <expr> is a c
8ae0: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
8af0: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
8b00: 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e    Only return en
8b10: 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tries of.** the 
8b20: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
8b30: 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c  where Y is a col
8b40: 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  umn in another t
8b50: 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73  able if no terms
8b60: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
8b70: 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65  "X <op> <const-e
8b80: 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49  xpr>" exist.   I
8b90: 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20  f no terms with 
8ba0: 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a  a constant RHS.*
8bb0: 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20  * exist, try to 
8bc0: 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68  return a term th
8bd0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
8be0: 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61  WO_EQUIV..*/.sta
8bf0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
8c00: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
8c10: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
8c20: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
8c30: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
8c40: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
8c50: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
8c60: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
8c70: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
8c80: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
8c90: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
8ca0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
8cb0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
8cc0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
8cd0: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
8ce0: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
8cf0: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
8d00: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
8d10: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
8d20: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
8d30: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
8d40: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
8d50: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
8d60: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
8d70: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
8d80: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
8d90: 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  rm *pResult = 0;
8da0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b  .  WhereTerm *p;
8db0: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
8dc0: 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53  n;..  p = whereS
8dd0: 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
8de0: 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d  WC, iCur, iColum
8df0: 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20  n, op, pIdx);.  
8e00: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
8e10: 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52 69  if( (p->prereqRi
8e20: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
8e30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
8e40: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  p->prereqRight==
8e50: 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61 74  0 && (p->eOperat
8e60: 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a  or&WO_EQ)!=0 ){.
8e70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
8e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8e90: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
8ea0: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
8eb0: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
8ec0: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
8ed0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8ee0: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Result;.}../* Fo
8ef0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
8f00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
8f10: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
8f20: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
8f30: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
8f40: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
8f50: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
8f60: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
8f70: 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74    .**.**.*/.stat
8f80: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
8f90: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
8fa0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
8fb0: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
8fc0: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
8fd0: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
8fe0: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
8ff0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
9000: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
9010: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
9020: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
9030: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
9040: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
9050: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
9060: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9070: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
9080: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
9090: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
90a0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
90b0: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
90c0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
90d0: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
90e0: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
90f0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
9100: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
9110: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
9120: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
9130: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
9140: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
9150: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
9160: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
9170: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
9180: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
9190: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
91a0: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
91b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
91c0: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
91d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
91e0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
91f0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
9200: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
9210: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
9220: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
9230: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
9240: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
9250: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
9260: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
9270: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
9280: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
9290: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
92a0: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
92b0: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
92c0: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
92d0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
92e0: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
92f0: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
9300: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9310: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
9320: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9330: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
9340: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
9350: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
9360: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
9370: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
9380: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
9390: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
93a0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
93b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
93c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
93d0: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
93e0: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
93f0: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9410: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
9420: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
9430: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
9440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9450: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
9460: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
9470: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
9480: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
9490: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
94a0: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
94b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
94c0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
94d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
94e0: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
94f0: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
9500: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9520: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
9530: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  t */..  if( !sql
9540: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
9550: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
9560: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
9570: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9580: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
9590: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
95a0: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
95b0: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
95c0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
95d0: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
95e0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
95f0: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
9600: 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20  K_COLUMN .   || 
9610: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
9620: 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49  ity(pLeft)!=SQLI
9630: 54 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20  TE_AFF_TEXT .   
9640: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65  || IsVirtual(pLe
9650: 66 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20  ft->pTab).  ){. 
9660: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30     /* IMP: R-020
9670: 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66  65-49465 The lef
9680: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
9690: 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20  he LIKE or GLOB 
96a0: 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20  operator must.  
96b0: 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65    ** be the name
96c0: 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63   of an indexed c
96d0: 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20  olumn with TEXT 
96e0: 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
96f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9700: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
9710: 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b  iColumn!=(-1) );
9720: 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20   /* Because IPK 
9730: 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54 45  never has AFF_TE
9740: 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20  XT */..  pRight 
9750: 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  = pList->a[0].pE
9760: 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67  xpr;.  op = pRig
9770: 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70  ht->op;.  if( op
9780: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
9790: 0a 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74  .    op = pRight
97a0: 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28  ->op2;.  }.  if(
97b0: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
97c0: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52   ){.    Vdbe *pR
97d0: 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73  eprepare = pPars
97e0: 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20  e->pReprepare;. 
97f0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52     int iCol = pR
9800: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  ight->iColumn;. 
9810: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
9820: 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70 52  3VdbeGetValue(pR
9830: 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20  eprepare, iCol, 
9840: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
9850: 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26  ;.    if( pVal &
9860: 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
9870: 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49  type(pVal)==SQLI
9880: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
9890: 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c   z = (char *)sql
98a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
98b0: 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pVal);.    }.   
98c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
98d0: 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
98e0: 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Vdbe, iCol);.   
98f0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d   assert( pRight-
9900: 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45  >op==TK_VARIABLE
9910: 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   || pRight->op==
9920: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
9930: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
9940: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
9950: 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54  z = pRight->u.zT
9960: 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  oken;.  }.  if( 
9970: 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30  z ){.    cnt = 0
9980: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d  ;.    while( (c=
9990: 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21  z[cnt])!=0 && c!
99a0: 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[0] && c!=wc[
99b0: 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29  1] && c!=wc[2] )
99c0: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
99d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74     }.    if( cnt
99e0: 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29  !=0 && 255!=(u8)
99f0: 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20  z[cnt-1] ){.    
9a00: 20 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b    Expr *pPrefix;
9a10: 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c  .      *pisCompl
9a20: 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26  ete = c==wc[0] &
9a30: 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20  & z[cnt+1]==0;. 
9a40: 20 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73       pPrefix = s
9a50: 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
9a60: 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20  K_STRING, z);.  
9a70: 20 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20      if( pPrefix 
9a80: 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f  ) pPrefix->u.zTo
9a90: 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20  ken[cnt] = 0;.  
9aa0: 20 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20      *ppPrefix = 
9ab0: 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69  pPrefix;.      i
9ac0: 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  f( op==TK_VARIAB
9ad0: 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64  LE ){.        Vd
9ae0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9af0: 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73  pVdbe;.        s
9b00: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
9b10: 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e  mask(v, pRight->
9b20: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
9b30: 20 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65    if( *pisComple
9b40: 74 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e  te && pRight->u.
9b50: 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20  zToken[1] ){.   
9b60: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
9b70: 20 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45   rhs of the LIKE
9b80: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
9b90: 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74   variable, and t
9ba0: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20  he current.     
9bb0: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
9bc0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65   the variable me
9bd0: 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ans there is no 
9be0: 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74  need to invoke t
9bf0: 68 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20  he LIKE.        
9c00: 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74    ** function, t
9c10: 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62  hen no OP_Variab
9c20: 6c 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64  le will be added
9c30: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
9c40: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
9c50: 69 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65  is causes proble
9c60: 6d 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ms for the sqlit
9c70: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
9c80: 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20  r_name().       
9c90: 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f     ** API. To wo
9ca0: 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61  rkaround them, a
9cb0: 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61  dd a dummy OP_Va
9cc0: 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20  riable here..   
9cd0: 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20         */ .     
9ce0: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
9cf0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
9d00: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
9d10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
9d20: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
9d30: 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20   pRight, r1);.  
9d40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9d50: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73  dbeChangeP3(v, s
9d60: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
9d70: 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a  tAddr(v)-1, 0);.
9d80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9d90: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
9da0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
9db0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9dc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9dd0: 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  z = 0;.    }.  }
9de0: 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ..  sqlite3Value
9df0: 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65  Free(pVal);.  re
9e00: 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23  turn (z!=0);.}.#
9e10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9e20: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
9e30: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e  ZATION */...#ifn
9e40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9e50: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
9e60: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
9e70: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
9e80: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
9e90: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
9ea0: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43       column MATC
9eb0: 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20  H expr.**.** If 
9ec0: 69 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72  it is then retur
9ed0: 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c  n TRUE.  If not,
9ee0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a   return FALSE..*
9ef0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d  /.static int isM
9f00: 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20  atchOfColumn(.  
9f10: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
9f20: 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78   /* Test this ex
9f30: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  pression */.){. 
9f40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9f50: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ;..  if( pExpr->
9f60: 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op!=TK_FUNCTION 
9f70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9f80: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
9f90: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
9fa0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68  >u.zToken,"match
9fb0: 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")!=0 ){.    ret
9fc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
9fd0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
9fe0: 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
9ff0: 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20  ->nExpr!=2 ){.  
a000: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a010: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31    if( pList->a[1
a020: 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54  ].pExpr->op != T
a030: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
a040: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a050: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
a060: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
a070: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
a080: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
a090: 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e  pBase expression
a0a0: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
a0b0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
a0c0: 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f  lause of.** a jo
a0d0: 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  in, then transfe
a0e0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
a0f0: 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20  e markings over 
a100: 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73  to derived..*/.s
a110: 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73  tatic void trans
a120: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
a130: 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20  Expr *pDerived, 
a140: 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20  Expr *pBase){.  
a150: 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20  pDerived->flags 
a160: 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20  |= pBase->flags 
a170: 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20  & EP_FromJoin;. 
a180: 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68   pDerived->iRigh
a190: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61  tJoinTable = pBa
a1a0: 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  se->iRightJoinTa
a1b0: 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  ble;.}..#if !def
a1c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a1d0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
a1e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
a1f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
a200: 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  RY)./*.** Analyz
a210: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f  e a term that co
a220: 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72  nsists of two or
a230: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
a240: 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20  ed.** subterms. 
a250: 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20   So in:.**.**   
a260: 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d    ... WHERE  (a=
a270: 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63  5) AND (b=7 OR c
a280: 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20  =9 OR d=13) AND 
a290: 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20  (d=13).**       
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2b0: 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e     ^^^^^^^^^^^^^
a2c0: 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68  ^^^^^^^.**.** Th
a2d0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79  is routine analy
a2e0: 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61  zes terms such a
a2f0: 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72  s the middle ter
a300: 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65  m in the above e
a310: 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65  xample..** A Whe
a320: 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20  reOrTerm object 
a330: 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20  is computed and 
a340: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
a350: 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e  term under.** an
a360: 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65  alysis, regardle
a370: 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d  ss of the outcom
a380: 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69  e of the analysi
a390: 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a  s.  Hence:.**.**
a3a0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77       WhereTerm.w
a3b0: 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52  tFlags   |=  TER
a3c0: 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20  M_ORINFO.**     
a3d0: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
a3e0: 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69  nfo  =  a dynami
a3f0: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
a400: 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65  WhereOrTerm obje
a410: 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  ct.**.** The ter
a420: 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  m being analyzed
a430: 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f   must have two o
a440: 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e  r more of OR-con
a450: 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e  nected subterms.
a460: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62  .** A single sub
a470: 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20  term might be a 
a480: 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65  set of AND-conne
a490: 63 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d  cted sub-subterm
a4a0: 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f  s..** Examples o
a4b0: 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e  f terms under an
a4c0: 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  alysis:.**.**   
a4d0: 20 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74    (A)     t1.x=t
a4e0: 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a  2.y OR t1.x=t2.z
a4f0: 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74   OR t1.y=15 OR t
a500: 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20  1.z=t3.a+5.**   
a510: 20 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72    (B)     x=expr
a520: 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20  1 OR expr2=x OR 
a530: 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28  x=expr3.**     (
a540: 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79  C)     t1.x=t2.y
a550: 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41   OR (t1.x=t2.z A
a560: 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20  ND t1.y=15).**  
a570: 20 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70     (D)     x=exp
a580: 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20  r1 OR (y>11 AND 
a590: 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20  y<22 AND z LIKE 
a5a0: 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20  '*hello*').**   
a5b0: 20 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31    (E)     (p.a=1
a5c0: 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72   AND q.b=2 AND r
a5d0: 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20  .c=3) OR (p.x=4 
a5e0: 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e  AND q.y=5 AND r.
a5f0: 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20  z=6).**.** CASE 
a600: 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  1:.**.** If all 
a610: 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20  subterms are of 
a620: 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70  the form T.C=exp
a630: 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c  r for some singl
a640: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e  e column of C an
a650: 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61  d.** a single ta
a660: 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20  ble T (as shown 
a670: 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f  in example B abo
a680: 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ve) then create 
a690: 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a  a new virtual.**
a6a0: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e   term that is an
a6b0: 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65   equivalent IN e
a6c0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f  xpression.  In o
a6d0: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
a6e0: 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67  he term.** being
a6f0: 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a   analyzed is:.**
a700: 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70  .**      x = exp
a710: 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20  r1  OR  expr2 = 
a720: 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33  x  OR  x = expr3
a730: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61  .**.** then crea
a740: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
a750: 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a   term like this:
a760: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
a770: 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78   (expr1,expr2,ex
a780: 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20  pr3).**.** CASE 
a790: 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  2:.**.** If all 
a7a0: 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64  subterms are ind
a7b0: 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67  exable by a sing
a7c0: 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e  le table T, then
a7d0: 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57   set.**.**     W
a7e0: 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74  hereTerm.eOperat
a7f0: 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  or              
a800: 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20  =  WO_OR.**     
a810: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
a820: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20  nfo->indexable  
a830: 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e  |=  the cursor n
a840: 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20  umber for table 
a850: 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72  T.**.** A subter
a860: 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22  m is "indexable"
a870: 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65   if it is of the
a880: 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f   form.** "T.C <o
a890: 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65  p> <expr>" where
a8a0: 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e   C is any column
a8b0: 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20   of table T and 
a8c0: 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  .** <op> is one 
a8d0: 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d  of "=", "<", "<=
a8e0: 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49  ", ">", ">=", "I
a8f0: 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22  S NULL", or "IN"
a900: 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69  ..** A subterm i
a910: 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65  s also indexable
a920: 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44   if it is an AND
a930: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
a940: 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61  ** subsubterms a
a950: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77  t least one of w
a960: 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c  hich is indexabl
a970: 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e  e.  Indexable AN
a980: 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68  D .** subterms h
a990: 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61  ave their eOpera
a9a0: 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e  tor set to WO_AN
a9b0: 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a  D and they have.
a9c0: 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65  ** u.pAndInfo se
a9d0: 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c  t to a dynamical
a9e0: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  ly allocated Whe
a9f0: 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74  reAndTerm object
aa00: 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f  ..**.** From ano
aa10: 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69  ther point of vi
aa20: 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20  ew, "indexable" 
aa30: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73  means that the s
aa40: 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20  ubterm could.** 
aa50: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75  potentially be u
aa60: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
aa70: 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69  x if an appropri
aa80: 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73  ate index exists
aa90: 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73  ..** This analys
aaa0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73  is does not cons
aab0: 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20  ider whether or 
aac0: 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78  not the index ex
aad0: 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73  ists; that.** is
aae0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62   something the b
aaf0: 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69  estIndex() routi
ab00: 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e  ne will determin
ab10: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
ab20: 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20  s.** only looks 
ab30: 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65  at whether subte
ab40: 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65 20  rms appropriate 
ab50: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
ab60: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
ab70: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
ab80: 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74   E above all sat
ab90: 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75  isfy case 2.  Bu
aba0: 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61  t if a term.** a
abb0: 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63  lso statisfies c
abc0: 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42  ase 1 (such as B
abd0: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
abe0: 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c  he optimizer wil
abf0: 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66  l.** always pref
ac00: 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e  er case 1, so in
ac10: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72   that case we pr
ac20: 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20  etend that case 
ac30: 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69  2 is not.** sati
ac40: 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  sfied..**.** It 
ac50: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
ac60: 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20  e that multiple 
ac70: 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78  tables are index
ac80: 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  able.  For examp
ac90: 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65  le,.** (E) above
aca0: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e   is indexable on
acb0: 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e   tables P, Q, an
acc0: 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  d R..**.** Terms
acd0: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
ace0: 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61  se 2 are candida
acf0: 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62  tes for lookup b
ad00: 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72  y using.** separ
ad10: 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66  ate indices to f
ad20: 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65  ind rowids for e
ad30: 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20  ach subterm and 
ad40: 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  composing.** the
ad50: 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f   union of all ro
ad60: 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77  wids using a Row
ad70: 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
ad80: 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20  s is similar.** 
ad90: 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63  to "bitmap indic
ada0: 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74  es" in other dat
adb0: 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a  abase engines..*
adc0: 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a  *.** OTHERWISE:.
add0: 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72  **.** If neither
ade0: 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65   case 1 nor case
adf0: 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c   2 apply, then l
ae00: 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74  eave the eOperat
ae10: 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72  or set to.** zer
ae20: 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73  o.  This term is
ae30: 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20   not useful for 
ae40: 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  search..*/.stati
ae50: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
ae60: 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c  zeOrTerm(.  SrcL
ae70: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
ae80: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
ae90: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
aea0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
aeb0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63          /* the c
aec0: 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c  omplete WHERE cl
aed0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
aee0: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
aef0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
af00: 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62  the OR-term to b
af10: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
af20: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
af30: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
af40: 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48  fo;        /* WH
af50: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
af60: 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ssing context */
af70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
af80: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
af90: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e;         /* Pa
afa0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
afb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
afc0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
afd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
afe0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
aff0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
b000: 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
b010: 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a  [idxTerm];    /*
b020: 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
b030: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78  analyzed */.  Ex
b040: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
b050: 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20  m->pExpr;       
b060: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
b070: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74  ression of the t
b080: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  erm */.  int i; 
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b0c0: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
b0d0: 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20  se *pOrWc;      
b0e0: 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70   /* Breakup of p
b0f0: 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72  Term into subter
b100: 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ms */.  WhereTer
b110: 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20  m *pOrTerm;     
b120: 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20    /* A Sub-term 
b130: 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63  within the pOrWc
b140: 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66   */.  WhereOrInf
b150: 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20  o *pOrInfo;     
b160: 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e  /* Additional in
b170: 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69  formation associ
b180: 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20  ated with pTerm 
b190: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e  */.  Bitmask chn
b1a0: 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f  gToIN;         /
b1b0: 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69  * Tables that mi
b1c0: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
b1d0: 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20   1 */.  Bitmask 
b1e0: 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20  indexable;      
b1f0: 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
b200: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20   are indexable, 
b210: 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20  satisfying case 
b220: 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 */..  /*.  ** 
b230: 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61  Break the OR cla
b240: 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70  use into its sep
b250: 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20  arate subterms. 
b260: 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72   The subterms ar
b270: 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
b280: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73   a WhereClause s
b290: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
b2a0: 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57  ing within the W
b2b0: 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20  hereOrInfo.  ** 
b2c0: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61  object that is a
b2d0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f  ttached to the o
b2e0: 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73  riginal OR claus
b2f0: 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61  e term..  */.  a
b300: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
b310: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44  tFlags & (TERM_D
b320: 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e  YNAMIC|TERM_ORIN
b330: 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29  FO|TERM_ANDINFO)
b340: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
b350: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b360: 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75  OR );.  pTerm->u
b370: 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e  .pOrInfo = pOrIn
b380: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
b390: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
b3a0: 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a  eof(*pOrInfo));.
b3b0: 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30    if( pOrInfo==0
b3c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65   ) return;.  pTe
b3d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
b3e0: 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f  ERM_ORINFO;.  pO
b3f0: 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e  rWc = &pOrInfo->
b400: 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  wc;.  whereClaus
b410: 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49  eInit(pOrWc, pWI
b420: 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  nfo);.  whereSpl
b430: 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c  it(pOrWc, pExpr,
b440: 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41   TK_OR);.  exprA
b450: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
b460: 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62  pOrWc);.  if( db
b470: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b480: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
b490: 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e  t( pOrWc->nTerm>
b4a0: 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  =2 );..  /*.  **
b4b0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74   Compute the set
b4c0: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
b4d0: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
b4e0: 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f  ses 1 or 2..  */
b4f0: 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e  .  indexable = ~
b500: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68  (Bitmask)0;.  ch
b510: 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61  ngToIN = ~(Bitma
b520: 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f  sk)0;.  for(i=pO
b530: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
b540: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
b550: 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c  i>=0 && indexabl
b560: 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  e; i--, pOrTerm+
b570: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72  +){.    if( (pOr
b580: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
b590: 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  & WO_SINGLE)==0 
b5a0: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e  ){.      WhereAn
b5b0: 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b  dInfo *pAndInfo;
b5c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
b5d0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
b5e0: 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   & (TERM_ANDINFO
b5f0: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d  |TERM_ORINFO))==
b600: 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54  0 );.      chngT
b610: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  oIN = 0;.      p
b620: 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  AndInfo = sqlite
b630: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
b640: 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66   sizeof(*pAndInf
b650: 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  o));.      if( p
b660: 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  AndInfo ){.     
b670: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
b680: 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20  pAndWC;.        
b690: 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54  WhereTerm *pAndT
b6a0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  erm;.        int
b6b0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   j;.        Bitm
b6c0: 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20  ask b = 0;.     
b6d0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41     pOrTerm->u.pA
b6e0: 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66  ndInfo = pAndInf
b6f0: 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  o;.        pOrTe
b700: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
b710: 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20  ERM_ANDINFO;.   
b720: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f       pOrTerm->eO
b730: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44  perator = WO_AND
b740: 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43  ;.        pAndWC
b750: 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63   = &pAndInfo->wc
b760: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43  ;.        whereC
b770: 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43  lauseInit(pAndWC
b780: 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a  , pWC->pWInfo);.
b790: 20 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c          whereSpl
b7a0: 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65  it(pAndWC, pOrTe
b7b0: 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e  rm->pExpr, TK_AN
b7c0: 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72  D);.        expr
b7d0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
b7e0: 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20   pAndWC);.      
b7f0: 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72    pAndWC->pOuter
b800: 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
b810: 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61  testcase( db->ma
b820: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
b830: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
b840: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b850: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
b860: 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57  , pAndTerm=pAndW
b870: 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e  C->a; j<pAndWC->
b880: 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64  nTerm; j++, pAnd
b890: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
b8a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e       assert( pAn
b8b0: 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  dTerm->pExpr );.
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b8d0: 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65  allowedOp(pAndTe
b8e0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29  rm->pExpr->op) )
b8f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b900: 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  b |= getMask(&pW
b910: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
b920: 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pAndTerm->leftCu
b930: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rsor);.         
b940: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
b950: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b960: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
b970: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
b980: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
b990: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
b9a0: 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20  _COPIED ){.     
b9b0: 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65   /* Skip this te
b9c0: 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20  rm for now.  We 
b9d0: 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20  revisit it when 
b9e0: 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20  we process the. 
b9f0: 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f       ** correspo
ba00: 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55  nding TERM_VIRTU
ba10: 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d  AL term */.    }
ba20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
ba30: 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  ask b;.      b =
ba40: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
ba50: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
ba60: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
ba70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
ba80: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
ba90: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20  ERM_VIRTUAL ){. 
baa0: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
bab0: 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57   *pOther = &pOrW
bac0: 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50  c->a[pOrTerm->iP
bad0: 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20  arent];.        
bae0: 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  b |= getMask(&pW
baf0: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
bb00: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
bb10: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
bb20: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
bb30: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f  b;.      if( (pO
bb40: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
bb50: 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a   & WO_EQ)==0 ){.
bb60: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
bb70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
bb80: 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  e{.        chngT
bb90: 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20  oIN &= b;.      
bba0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
bbb0: 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68  *.  ** Record th
bbc0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
bbd0: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
bbe0: 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69  e 2.  The set mi
bbf0: 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74  ght be.  ** empt
bc00: 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66  y..  */.  pOrInf
bc10: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69  o->indexable = i
bc20: 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72  ndexable;.  pTer
bc30: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69  m->eOperator = i
bc40: 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20  ndexable==0 ? 0 
bc50: 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20  : WO_OR;..  /*. 
bc60: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c   ** chngToIN hol
bc70: 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c  ds a set of tabl
bc80: 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20  es that *might* 
bc90: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20  satisfy case 1. 
bca0: 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76   But.  ** we hav
bcb0: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64  e to do some add
bcc0: 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67  itional checking
bcd0: 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20   to see if case 
bce0: 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73  1 really.  ** is
bcf0: 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a   satisfied..  **
bd00: 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77  .  ** chngToIN w
bd10: 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20  ill hold either 
bd20: 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e  0, 1, or 2 bits.
bd30: 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65    The 0-bit case
bd40: 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
bd50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73   there is no pos
bd60: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e  sibility of tran
bd70: 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20  sforming the OR 
bd80: 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20  clause into an. 
bd90: 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   ** IN operator 
bda0: 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d  because one or m
bdb0: 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ore terms in the
bdc0: 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   OR clause conta
bdd0: 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e  in.  ** somethin
bde0: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20  g other than == 
bdf0: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  on a column in t
be00: 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e  he single table.
be10: 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a    The 1-bit.  **
be20: 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74   case means that
be30: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
be40: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20  he OR clause is 
be50: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a  of the form.  **
be60: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65   "table.column=e
be70: 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69  xpr" for some si
be80: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
be90: 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73   one bit that is
bea0: 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63   set.  ** will c
beb0: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
bec0: 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20   common table.  
bed0: 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  We still need to
bee0: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20   check to make. 
bef0: 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d   ** sure the sam
bf00: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  e column is used
bf10: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20   on all terms.  
bf20: 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69  The 2-bit case i
bf30: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  s when.  ** the 
bf40: 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66  all terms are of
bf50: 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65   the form "table
bf60: 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e  1.column=table2.
bf70: 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a  column".  It.  *
bf80: 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69  * might be possi
bf90: 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49  ble to form an I
bfa0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
bfb0: 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f  either table1.co
bfc0: 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62  lumn.  ** or tab
bfd0: 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68  le2.column as th
bfe0: 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20  e LHS if either 
bff0: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65  is common to eve
c000: 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20  ry term of.  ** 
c010: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20  the OR clause.. 
c020: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
c030: 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  at terms of the 
c040: 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75  form "table.colu
c050: 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  mn1=table.column
c060: 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d  2" (the.  ** sam
c070: 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20  e table on both 
c080: 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29  sizes of the ==)
c090: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
c0a0: 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
c0b0: 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20   chngToIN ){.   
c0c0: 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   int okToChngToI
c0d0: 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  N = 0;     /* Tr
c0e0: 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72  ue if the conver
c0f0: 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61  sion to IN is va
c100: 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  lid */.    int i
c110: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20  Column = -1;    
c120: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69       /* Column i
c130: 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49  ndex on lhs of I
c140: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
c150: 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20    int iCursor = 
c160: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  -1;         /* T
c170: 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d  able cursor comm
c180: 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20  on to all terms 
c190: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30  */.    int j = 0
c1a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c1b0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c1c0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72   */..    /* Sear
c1d0: 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61  ch for a table a
c1e0: 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61  nd column that a
c1f0: 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69  ppears on one si
c200: 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  de or the.    **
c210: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d   other of the ==
c220: 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65   operator in eve
c230: 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61  ry subterm.  Tha
c240: 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  t table and colu
c250: 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  mn.    ** will b
c260: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43  e recorded in iC
c270: 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d  ursor and iColum
c280: 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20  n.  There might 
c290: 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a  not be any.    *
c2a0: 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64  * such table and
c2b0: 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b   column.  Set ok
c2c0: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e  ToChngToIN if an
c2d0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62   appropriate tab
c2e0: 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f  le.    ** and co
c2f0: 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75  lumn is found bu
c300: 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67  t leave okToChng
c310: 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f  ToIN false if no
c320: 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a  t found..    */.
c330: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32      for(j=0; j<2
c340: 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49   && !okToChngToI
c350: 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  N; j++){.      p
c360: 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e  OrTerm = pOrWc->
c370: 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  a;.      for(i=p
c380: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  OrWc->nTerm-1; i
c390: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  >=0; i--, pOrTer
c3a0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
c3b0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
c3c0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
c3d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   );.        pOrT
c3e0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20  erm->wtFlags &= 
c3f0: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
c400: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
c410: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
c420: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
c430: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
c440: 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64  e 2-bit case and
c450: 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73   we are on the s
c460: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
c470: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
c480: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
c490: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
c4a0: 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73  iteration.  So s
c4b0: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a  kip this term. *
c4c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
c4d0: 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20  rt( j==1 );.    
c4e0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
c4f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c500: 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20    if( (chngToIN 
c510: 26 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  & getMask(&pWInf
c520: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72  o->sMaskSet, pOr
c530: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
c540: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
c550: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
c560: 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  must be of the f
c570: 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77  orm t1.a==t2.b w
c580: 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68  here t2 is in th
c590: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
c5a0: 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20  hngToIN set but 
c5b0: 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73  t1 is not.  This
c5c0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69   term will be ei
c5d0: 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20  ther preceeded. 
c5e0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
c5f0: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
c600: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
c610: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
c620: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
c630: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
c640: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
c650: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
c660: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
c670: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
c680: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
c690: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
c6a0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
c6b0: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
c6c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c6d0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
c6e0: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
c6f0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
c700: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
c710: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
c720: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
c730: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
c740: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
c750: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
c760: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
c770: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c780: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c790: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
c7a0: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
c7b0: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
c7c0: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
c7d0: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
c7e0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
c7f0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
c800: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
c810: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
c820: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
c830: 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29  rOfTwo(chngToIN)
c840: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
c850: 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65  rt( chngToIN==ge
c860: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
c870: 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72  MaskSet, iCursor
c880: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ) );.        bre
c890: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
c8a0: 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31    testcase( j==1
c8b0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65   );..      /* We
c8c0: 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61   have found a ca
c8d0: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e  ndidate table an
c8e0: 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b  d column.  Check
c8f0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a   to see if that.
c900: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
c910: 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d  nd column is com
c920: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
c930: 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75  m in the OR clau
c940: 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f  se */.      okTo
c950: 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20  ChngToIN = 1;.  
c960: 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26      for(; i>=0 &
c970: 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20  & okToChngToIN; 
c980: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
c990: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c9a0: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
c9b0: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
c9c0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
c9d0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
c9e0: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
c9f0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
ca00: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
ca10: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  R_OK;.        }e
ca20: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
ca30: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69  >u.leftColumn!=i
ca40: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
ca50: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
ca60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
ca70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
ca80: 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52  nt affLeft, affR
ca90: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
caa0: 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d  /* If the right-
cab0: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73  hand side is als
cac0: 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  o a column, then
cad0: 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a   the affinities.
cae0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
caf0: 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c  both right and l
cb00: 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62  eft sides must b
cb10: 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74  e such that no t
cb20: 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ype.          **
cb30: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
cb40: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65   required on the
cb50: 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74   right.  (Ticket
cb60: 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20   #2249).        
cb70: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61    */.          a
cb80: 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  ffRight = sqlite
cb90: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
cba0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
cbb0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
cbc0: 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74   affLeft = sqlit
cbd0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
cbe0: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
cbf0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
cc00: 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30   if( affRight!=0
cc10: 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66   && affRight!=af
cc20: 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  fLeft ){.       
cc30: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
cc40: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  N = 0;.         
cc50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cc60: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
cc70: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f  lags |= TERM_OR_
cc80: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
cc90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cca0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ccb0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f  At this point, o
ccc0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74  kToChngToIN is t
ccd0: 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20  rue if original 
cce0: 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a  pTerm satisfies.
ccf0: 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20      ** case 1.  
cd00: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f  In that case, co
cd10: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69  nstruct a new vi
cd20: 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20  rtual term that 
cd30: 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d  is .    ** pTerm
cd40: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
cd50: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  an IN operator..
cd60: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56      **.    ** EV
cd70: 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a  : R-00211-15100.
cd80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
cd90: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20  kToChngToIN ){. 
cda0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
cdc0: 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69   transient dupli
cdd0: 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  cate expression 
cde0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
cdf0: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20  t *pList = 0;   
ce00: 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68  /* The RHS of th
ce10: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
ce20: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
ce30: 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ft = 0;       /*
ce40: 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   The LHS of the 
ce50: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
ce60: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ce80: 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f  he complete IN o
ce90: 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20  perator */..    
cea0: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
ceb0: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
cec0: 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20  pOrWc->a; i>=0; 
ced0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
cee0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
cef0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
cf00: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20   TERM_OR_OK)==0 
cf10: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
cf20: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
cf30: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
cf40: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
cf50: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
cf60: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
cf70: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20  Cursor );.      
cf80: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
cf90: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
cfa0: 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  =iColumn );.    
cfb0: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
cfc0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
cfd0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
cfe0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
cff0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
d000: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
d010: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
d020: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
d030: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f        pLeft = pO
d040: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
d050: 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eft;.      }.   
d060: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
d070: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75  !=0 );.      pDu
d080: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
d090: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
d0a0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
d0b0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
d0c0: 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  se, TK_IN, pDup,
d0d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
d0e0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
d0f0: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
d100: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
d110: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
d120: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
d130: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
d140: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
d150: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
d160: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
d170: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
d180: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
d190: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
d1a0: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
d1b0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
d1c0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
d1d0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
d1e0: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
d1f0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
d200: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
d210: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
d220: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
d230: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
d240: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
d250: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
d260: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
d270: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
d280: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
d290: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
d2a0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
d2b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65       }.      pTe
d2c0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
d2d0: 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73  WO_NOOP;  /* cas
d2e0: 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20  e 1 trumps case 
d2f0: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  2 */.    }.  }.}
d300: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
d310: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
d320: 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49  IZATION && !SQLI
d330: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
d340: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69   */../*.** The i
d350: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
d360: 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65  tine is an Where
d370: 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77  Term structure w
d380: 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  ith only the.** 
d390: 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69  "pExpr" field fi
d3a0: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
d3b0: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
d3c0: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
d3d0: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
d3e0: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
d3f0: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
d400: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
d410: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
d420: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
d430: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
d440: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65   of the form "<e
d450: 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20  xpr> <op> X" it 
d460: 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a  gets commuted.**
d470: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
d480: 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e   form of "X <op>
d490: 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20   <expr>"..**.** 
d4a0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
d4b0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
d4c0: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
d4d0: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
d4e0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74  re.** columns, t
d4f0: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
d500: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
d510: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
d520: 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65  ew virtual.** te
d530: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
d540: 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64  Y <op> X" is add
d550: 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ed to the WHERE 
d560: 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e  clause and.** an
d570: 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c  alyzed separatel
d580: 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  y.  The original
d590: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
d5a0: 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44  with TERM_COPIED
d5b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20  .** and the new 
d5c0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
d5d0: 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  ith TERM_DYNAMIC
d5e0: 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70   (because it's p
d5f0: 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  Expr.** needs to
d600: 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74   be freed with t
d610: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20  he WhereClause) 
d620: 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  and TERM_VIRTUAL
d630: 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20   (because it.** 
d640: 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f  is a commuted co
d650: 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65  py of a prior te
d660: 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e  rm.)  The origin
d670: 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69  al term has nChi
d680: 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ld=1.** and the 
d690: 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65  copy has idxPare
d6a0: 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  nt set to the in
d6b0: 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69  dex of the origi
d6c0: 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  nal term..*/.sta
d6d0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
d6e0: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
d6f0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
d700: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
d710: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
d720: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
d730: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
d740: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
d750: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
d760: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
d770: 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  of the term to b
d780: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
d790: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
d7a0: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
d7b0: 66 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  fo; /* WHERE cla
d7c0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  use processing c
d7d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
d7e0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d800: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
d810: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65  nalyzed */.  Whe
d820: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
d830: 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Set;          /*
d840: 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e   Set of table in
d850: 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45  dex masks */.  E
d860: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
d890: 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  n to be analyzed
d8a0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
d8b0: 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20  ereqLeft;       
d8c0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
d8d0: 75 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70  uesites of the p
d8e0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20  Expr->pLeft */. 
d8f0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
d900: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
d910: 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74    /* Prerequesit
d920: 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  es of pExpr */. 
d930: 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69   Bitmask extraRi
d940: 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ght = 0;        
d950: 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e    /* Extra depen
d960: 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20  dencies on LEFT 
d970: 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  JOIN */.  Expr *
d980: 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20  pStr1 = 0;      
d990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
d9a0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
d9b0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
d9c0: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d9e0: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
d9f0: 42 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64  B ends with wild
da00: 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  card */.  int no
da10: 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Case = 0;       
da20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
da30: 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75  KE/GLOB distingu
da40: 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20  ishes case */.  
da50: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70   /* Top-level op
da80: 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e  erator.  pExpr->
da90: 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  op */.  Parse *p
daa0: 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
dab0: 70 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73  pParse;  /* Pars
dac0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
dad0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
dae0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
daf0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
db00: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  nnection */..  i
db10: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
db20: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
db30: 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  n;.  }.  pTerm =
db40: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
db50: 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  ];.  pMaskSet = 
db60: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
db70: 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65  t;.  pExpr = pTe
db80: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73  rm->pExpr;.  ass
db90: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
dba0: 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e  TK_AS && pExpr->
dbb0: 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op!=TK_COLLATE )
dbc0: 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d  ;.  prereqLeft =
dbd0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
dbe0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
dbf0: 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20  >pLeft);.  op = 
dc00: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
dc10: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
dc20: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
dc30: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
dc40: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
dc50: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
dc60: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
dc70: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
dc80: 71 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c  qRight = exprSel
dc90: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
dca0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78  askSet, pExpr->x
dcb0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
dcc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72  else{.      pTer
dcd0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
dce0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
dcf0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
dd00: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
dd10: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
dd20: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
dd30: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
dd40: 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  reqRight = 0;.  
dd50: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d  }else{.    pTerm
dd60: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
dd70: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
dd80: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
dd90: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70  pRight);.  }.  p
dda0: 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54  rereqAll = exprT
ddb0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
ddc0: 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  et, pExpr);.  if
ddd0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
dde0: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
ddf0: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74  Join) ){.    Bit
de00: 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b  mask x = getMask
de10: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
de20: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
de30: 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c  e);.    prereqAl
de40: 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72  l |= x;.    extr
de50: 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f  aRight = x-1;  /
de60: 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d  * ON clause term
de70: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  s may not be use
de80: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a  d with an index.
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66         ** on lef
deb0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
dec0: 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20  T JOIN.  Ticket 
ded0: 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70  #3015 */.  }.  p
dee0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
def0: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70  = prereqAll;.  p
df00: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
df10: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
df20: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
df30: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
df40: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f   = 0;.  if( allo
df50: 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20  wedOp(op) ){.   
df60: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73   Expr *pLeft = s
df70: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
df80: 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65  llate(pExpr->pLe
df90: 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  ft);.    Expr *p
dfa0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
dfb0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
dfc0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
dfd0: 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20     u16 opMask = 
dfe0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
dff0: 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74  ght & prereqLeft
e000: 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20  )==0 ? WO_ALL : 
e010: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66  WO_EQUIV;.    if
e020: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
e030: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
e040: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
e050: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
e060: 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e;.      pTerm->
e070: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
e080: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
e090: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
e0a0: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
e0b0: 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73  Mask(op) & opMas
e0c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
e0d0: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
e0e0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
e0f0: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
e100: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
e110: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
e120: 20 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20     u16 eExtraOp 
e130: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
e140: 78 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e  xtra bits for pN
e150: 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f  ew->eOperator */
e160: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
e170: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20  ->leftCursor>=0 
e180: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
e190: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70  dxNew;.        p
e1a0: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
e1b0: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
e1c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
e1d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
e1f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
e200: 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  db, pDup);.     
e210: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
e220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
e230: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
e240: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
e250: 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  Dup, TERM_VIRTUA
e260: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
e270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
e280: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
e290: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
e2a0: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
e2b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
e2c0: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
e2d0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
e2e0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
e2f0: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  m];.        pTer
e300: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
e310: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74         pTerm->wt
e320: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
e330: 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  PIED;.        if
e340: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e350: 45 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21  EQ.         && !
e360: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e370: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
e380: 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  in).         && 
e390: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
e3a0: 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54  led(db, SQLITE_T
e3b0: 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20  ransitive).     
e3c0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
e3d0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
e3e0: 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20   |= WO_EQUIV;.  
e3f0: 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70          eExtraOp
e400: 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20   = WO_EQUIV;.   
e410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
e420: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70  se{.        pDup
e430: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
e440: 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a    pNew = pTerm;.
e450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
e460: 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65  prCommute(pParse
e470: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70  , pDup);.      p
e480: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
e490: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44  prSkipCollate(pD
e4a0: 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  up->pLeft);.    
e4b0: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73    pNew->leftCurs
e4c0: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
e4d0: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  le;.      pNew->
e4e0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
e4f0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
e500: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
e510: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
e520: 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72  raRight) != prer
e530: 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  eqLeft );.      
e540: 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68  pNew->prereqRigh
e550: 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c  t = prereqLeft |
e560: 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20   extraRight;.   
e570: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41     pNew->prereqA
e580: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
e590: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65        pNew->eOpe
e5a0: 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f  rator = (operato
e5b0: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20  rMask(pDup->op) 
e5c0: 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70  + eExtraOp) & op
e5d0: 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Mask;.    }.  }.
e5e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e5f0: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
e600: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49  IMIZATION.  /* I
e610: 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20  f a term is the 
e620: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
e630: 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77  , create two new
e640: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20   virtual terms. 
e650: 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20   ** that define 
e660: 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74  the range that t
e670: 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65  he BETWEEN imple
e680: 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d  ments.  For exam
e690: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
e6a0: 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20      a BETWEEN b 
e6b0: 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20  AND c.  **.  ** 
e6c0: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
e6d0: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
e6e0: 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41    (a BETWEEN b A
e6f0: 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29  ND c) AND (a>=b)
e700: 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a   AND (a<=c).  **
e710: 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65  .  ** The two ne
e720: 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  w terms are adde
e730: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
e740: 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  f the WhereClaus
e750: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54  e object..  ** T
e760: 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  he new terms are
e770: 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61   "dynamic" and a
e780: 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  re children of t
e790: 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57  he original BETW
e7a0: 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20  EEN.  ** term.  
e7b0: 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  That means that 
e7c0: 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74  if the BETWEEN t
e7d0: 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68  erm is coded, th
e7e0: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20  e children are. 
e7f0: 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72   ** skipped.  Or
e800: 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65  , if the childre
e810: 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20  n are satisfied 
e820: 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  by an index, the
e830: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42   original.  ** B
e840: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73  ETWEEN term is s
e850: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
e860: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
e870: 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26  p==TK_BETWEEN &&
e880: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
e890: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
e8a0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
e8b0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  >x.pList;.    in
e8c0: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
e8d0: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
e8e0: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
e8f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
e900: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
e910: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
e920: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
e930: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
e940: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
e950: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
e960: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
e970: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
e980: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70  PExpr(pParse, op
e990: 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  s[i], .         
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
e9c0: 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  up(db, pExpr->pL
e9d0: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ea00: 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
ea10: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20  a[i].pExpr, 0), 
ea20: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
ea30: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
ea40: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
ea50: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
ea60: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
ea70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ea80: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
ea90: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
eaa0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
eab0: 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  );.      pTerm =
eac0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ead0: 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ];.      pWC->a[
eae0: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
eaf0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d  = idxTerm;.    }
eb00: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69  .    pTerm->nChi
eb10: 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64  ld = 2;.  }.#end
eb20: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
eb30: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
eb40: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21  ZATION */..#if !
eb50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
eb60: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
eb70: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
eb80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
eb90: 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c  QUERY).  /* Anal
eba0: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
ebb0: 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74  is composed of t
ebc0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65  wo or more subte
ebd0: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
ebe0: 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72  .  ** an OR oper
ebf0: 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  ator..  */.  els
ec00: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
ec10: 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73  =TK_OR ){.    as
ec20: 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54  sert( pWC->op==T
ec30: 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70  K_AND );.    exp
ec40: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70  rAnalyzeOrTerm(p
ec50: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72  Src, pWC, idxTer
ec60: 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  m);.    pTerm = 
ec70: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ec80: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
ec90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
eca0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
ecb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ecc0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
ecd0: 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63  ATION.  /* Add c
ece0: 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65  onstraints to re
ecf0: 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20  duce the search 
ed00: 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20  space on a LIKE 
ed10: 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65  or GLOB.  ** ope
ed20: 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rator..  **.  **
ed30: 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20   A like pattern 
ed40: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c  of the form "x L
ed50: 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63  IKE 'abc%'" is c
ed60: 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73  hanged into cons
ed70: 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a  traints.  **.  *
ed80: 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61  *          x>='a
ed90: 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20  bc' AND x<'abd' 
eda0: 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25  AND x LIKE 'abc%
edb0: 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  '.  **.  ** The 
edc0: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f  last character o
edd0: 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62  f the prefix "ab
ede0: 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  c" is incremente
edf0: 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20  d to form the.  
ee00: 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  ** termination c
ee10: 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a  ondition "abd"..
ee20: 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e    */.  if( pWC->
ee30: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26  op==TK_AND .   &
ee40: 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70  & isLikeOrGlob(p
ee50: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70  Parse, pExpr, &p
ee60: 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74  Str1, &isComplet
ee70: 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b  e, &noCase).  ){
ee80: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
ee90: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f  ;       /* LHS o
eea0: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
eeb0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
eec0: 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f   *pStr2;       /
eed0: 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20  * Copy of pStr1 
eee0: 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  - RHS of LIKE/GL
eef0: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
ef00: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
ef10: 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  r1;.    Expr *pN
ef20: 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74  ewExpr2;.    int
ef30: 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e   idxNew1;.    in
ef40: 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54  t idxNew2;.    T
ef50: 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  oken sCollSeqNam
ef60: 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  e;  /* Name of c
ef70: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ef80: 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20  e */..    pLeft 
ef90: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
efa0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
efb0: 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65    pStr2 = sqlite
efc0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74  3ExprDup(db, pSt
efd0: 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  r1, 0);.    if( 
efe0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
eff0: 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c  d ){.      u8 c,
f000: 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c   *pC;       /* L
f010: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
f020: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
f030: 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20  ildcard */.     
f040: 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72   pC = (u8*)&pStr
f050: 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69  2->u.zToken[sqli
f060: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72  te3Strlen30(pStr
f070: 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b  2->u.zToken)-1];
f080: 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a  .      c = *pC;.
f090: 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65        if( noCase
f0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
f0b0: 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69  he point is to i
f0c0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73  ncrement the las
f0d0: 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f  t character befo
f0e0: 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  re the first.   
f0f0: 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64       ** wildcard
f100: 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63  .  But if we inc
f110: 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74  rement '@', that
f120: 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e   will push it in
f130: 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
f140: 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e  * alphabetic ran
f150: 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f  ge where case co
f160: 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d  nversions will m
f170: 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20  ess up the .    
f180: 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74      ** inequalit
f190: 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69  y.  To avoid thi
f1a0: 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20  s, make sure to 
f1b0: 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c  also run the ful
f1c0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b  l.        ** LIK
f1d0: 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61  E on all candida
f1e0: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62  te expressions b
f1f0: 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69  y clearing the i
f200: 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20  sComplete flag. 
f210: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f220: 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29    if( c=='A'-1 )
f230: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
f240: 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33     /* EV: R-6433
f250: 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20  9-08207 */...   
f260: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
f270: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
f280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
f290: 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
f2a0: 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  }.    sCollSeqNa
f2b0: 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20  me.z = noCase ? 
f2c0: 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41  "NOCASE" : "BINA
f2d0: 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65  RY";.    sCollSe
f2e0: 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20  qName.n = 6;.   
f2f0: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
f300: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
f310: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
f320: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
f330: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
f340: 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20  TK_GE, .        
f350: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
f360: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
f370: 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26  arse,pNewExpr1,&
f380: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20  sCollSeqName),. 
f390: 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c            pStr1,
f3a0: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31   0);.    idxNew1
f3b0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
f3c0: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
f3d0: 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr1, TERM_VIRTUA
f3e0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
f3f0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
f400: 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20  dxNew1==0 );.   
f410: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
f420: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29  c, pWC, idxNew1)
f430: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
f440: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
f450: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
f460: 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
f470: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
f480: 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20  rse, TK_LT,.    
f490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
f4a0: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
f4b0: 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70  n(pParse,pNewExp
f4c0: 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  r2,&sCollSeqName
f4d0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ),.           pS
f4e0: 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78  tr2, 0);.    idx
f4f0: 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75  New2 = whereClau
f500: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
f510: 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49  ewExpr2, TERM_VI
f520: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
f530: 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  IC);.    testcas
f540: 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b  e( idxNew2==0 );
f550: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
f560: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
f570: 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ew2);.    pTerm 
f580: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
f590: 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f  m];.    if( isCo
f5a0: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  mplete ){.      
f5b0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e  pWC->a[idxNew1].
f5c0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
f5d0: 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  m;.      pWC->a[
f5e0: 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74  idxNew2].iParent
f5f0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
f600: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
f610: 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 2;.    }.  }.#
f620: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f630: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
f640: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
f650: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
f660: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
f670: 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20   Add a WO_MATCH 
f680: 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74  auxiliary term t
f690: 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  o the constraint
f6a0: 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a   set if the.  **
f6b0: 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73   current express
f6c0: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
f6d0: 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43  rm:  column MATC
f6e0: 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69  H expr..  ** Thi
f6f0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
f700: 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65   used by the xBe
f710: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20  stIndex methods 
f720: 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  of.  ** virtual 
f730: 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74  tables.  The nat
f740: 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  ive query optimi
f750: 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74  zer does not att
f760: 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20  empt.  ** to do 
f770: 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41  anything with MA
f780: 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  TCH functions.. 
f790: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63   */.  if( isMatc
f7a0: 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29  hOfColumn(pExpr)
f7b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e   ){.    int idxN
f7c0: 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  ew;.    Expr *pR
f7d0: 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20  ight, *pLeft;.  
f7e0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
f7f0: 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61  wTerm;.    Bitma
f800: 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c  sk prereqColumn,
f810: 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20   prereqExpr;..  
f820: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
f830: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
f840: 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74  pExpr;.    pLeft
f850: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
f860: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
f870: 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20     prereqExpr = 
f880: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
f890: 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29  MaskSet, pRight)
f8a0: 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75  ;.    prereqColu
f8b0: 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  mn = exprTableUs
f8c0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
f8d0: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70  eft);.    if( (p
f8e0: 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72  rereqExpr & prer
f8f0: 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a  eqColumn)==0 ){.
f900: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
f910: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
f920: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
f930: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d  xpr(pParse, TK_M
f940: 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20  ATCH, .         
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45       0, sqlite3E
f970: 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68  xprDup(db, pRigh
f980: 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20  t, 0), 0);.     
f990: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
f9a0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
f9b0: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
f9c0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
f9d0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73  AMIC);.      tes
f9e0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
f9f0: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   );.      pNewTe
fa00: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
fa10: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
fa20: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
fa30: 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a  t = prereqExpr;.
fa40: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
fa50: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
fa60: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
fa70: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65    pNewTerm->u.le
fa80: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
fa90: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
faa0: 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72   pNewTerm->eOper
fab0: 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b  ator = WO_MATCH;
fac0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
fad0: 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
fae0: 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  rm;.      pTerm 
faf0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
fb00: 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  m];.      pTerm-
fb10: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
fb20: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
fb30: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
fb40: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
fb50: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54  ->prereqAll = pT
fb60: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a  erm->prereqAll;.
fb70: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
fb80: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
fb90: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
fba0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fbb0: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f 2a  NABLE_STAT3.  /*
fbc0: 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61   When sqlite_sta
fbd0: 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
fbe0: 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  a is available a
fbf0: 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68  n operator of th
fc00: 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49  e.  ** form "x I
fc10: 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20  S NOT NULL" can 
fc20: 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61  sometimes be eva
fc30: 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69  luated more effi
fc40: 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20  ciently.  ** as 
fc50: 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73  "x>NULL" if x is
fc60: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
fc70: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f  PRIMARY KEY.  So
fc80: 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a   construct a.  *
fc90: 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f  * virtual term o
fca0: 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a  f that form..  *
fcb0: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
fcc0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72   the virtual ter
fcd0: 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64  m must be tagged
fce0: 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c   with TERM_VNULL
fcf0: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52  .  This.  ** TER
fd00: 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c  M_VNULL tag will
fd10: 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f   suppress the no
fd20: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20  t-null check at 
fd30: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
fd40: 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ** of the loop. 
fd50: 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52   Without the TER
fd60: 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68  M_VNULL flag, th
fd70: 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
fd80: 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61   at.  ** the sta
fd90: 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  rt of the loop w
fda0: 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20  ill prevent any 
fdb0: 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69  results from bei
fdc0: 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  ng returned..  *
fdd0: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
fde0: 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
fdf0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
fe00: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
fe10: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
fe20: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20  ft->iColumn>=0. 
fe30: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
fe40: 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  ewExpr;.    Expr
fe50: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
fe60: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20  >pLeft;.    int 
fe70: 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72  idxNew;.    Wher
fe80: 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
fe90: 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d  ..    pNewExpr =
fea0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
feb0: 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20  arse, TK_GT,.   
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fed0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fee0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
fef0: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28     sqlite3PExpr(
ff20: 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c  pParse, TK_NULL,
ff30: 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a   0, 0, 0), 0);..
ff40: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
ff50: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
ff60: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20  WC, pNewExpr,.  
ff70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d              TERM
ff90: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
ffa0: 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c  NAMIC|TERM_VNULL
ffb0: 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65  );.    if( idxNe
ffc0: 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54  w ){.      pNewT
ffd0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
ffe0: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
fff0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
10000 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  ht = 0;.      pN
10010 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
10020 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
10030 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
10040 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
10050 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
10060 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
10070 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
10080 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77  O_GT;.      pNew
10090 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
100a0 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
100b0 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
100c0 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
100d0 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
100e0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
100f0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
10100 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
10110 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
10120 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
10130 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
10140 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10150 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a  ENABLE_STAT */..
10160 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20    /* Prevent ON 
10170 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
10180 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d  a LEFT JOIN from
10190 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64   being used to d
101a0 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  rive.  ** an ind
101b0 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f  ex for tables to
101c0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
101d0 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54   join..  */.  pT
101e0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
101f0 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a   |= extraRight;.
10200 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
10210 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
10220 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
10230 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
10240 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10250 74 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78 70 72  t.** for an expr
10260 65 73 73 69 6f 6e 20 6f 66 20 74 79 70 65 20 54  ession of type T
10270 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65  K_COLUMN that re
10280 66 65 72 73 20 74 6f 20 74 68 65 20 73 61 6d 65  fers to the same
10290 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a 20 75   column and.** u
102a0 73 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ses the same col
102b0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
102c0 61 73 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63  as the iCol'th c
102d0 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70  olumn of index p
102e0 49 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  Idx..** Argument
102f0 20 69 42 61 73 65 20 69 73 20 74 68 65 20 63 75   iBase is the cu
10300 72 73 6f 72 20 6e 75 6d 62 65 72 20 75 73 65 64  rsor number used
10310 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74   for the table t
10320 68 61 74 20 70 49 64 78 20 72 65 66 65 72 73 0a  hat pIdx refers.
10330 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ** to..**.** If 
10340 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69  such an expressi
10350 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73  on is found, its
10360 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d   index in pList-
10370 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64  >a[] is returned
10380 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65  . If.** no expre
10390 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
103a0 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
103b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
103c0 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61  ndIndexCol(.  Pa
103d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
103f0 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
10400 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
10410 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
10420 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
10430 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68  n list to search
10440 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c   */.  int iBase,
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10460 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10470 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69  for table associ
10480 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a  ated with pIdx *
10490 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
104c0 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  match column of 
104d0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20  */.  int iCol   
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f       /* Column o
10500 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  f index to match
10510 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
10520 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
10530 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
10540 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72  ll[iCol];..  for
10550 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
10560 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
10570 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
10580 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
10590 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
105a0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  pr);.    if( p->
105b0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
105c0 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e     && p->iColumn
105d0 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
105e0 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70  [iCol].     && p
105f0 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a  ->iTable==iBase.
10600 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c      ){.      Col
10610 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
10620 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
10630 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
10640 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
10650 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43     if( ALWAYS(pC
10660 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74  oll) && 0==sqlit
10670 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
10680 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
10690 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
106a0 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
106b0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
106c0 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
106d0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
106e0 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
106f0 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
10700 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
10710 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
10720 6e 64 61 6e 74 2e 20 41 20 44 49 53 54 49 4e 43  ndant. A DISTINC
10730 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64  T list is redund
10740 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62  ant if the datab
10750 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ase contains a.*
10760 2a 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 74  * UNIQUE index t
10770 68 61 74 20 67 75 61 72 61 6e 74 65 65 73 20 74  hat guarantees t
10780 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hat the result o
10790 66 20 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c  f the query will
107a0 20 62 65 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20   be distinct.** 
107b0 61 6e 79 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69  anyway..*/.stati
107c0 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74  c int isDistinct
107d0 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72  Redundant(.  Par
107e0 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 72  se *pParse,.  Sr
107f0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
10800 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
10810 70 57 43 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  pWC,.  ExprList 
10820 2a 70 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20  *pDistinct.){.  
10830 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
10840 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
10850 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
10870 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f   int iBase;..  /
10880 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
10890 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
108a0 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20  e or sub-select 
108b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
108c0 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  se of.  ** this 
108d0 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77  query, then it w
108e0 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
108f0 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ble to show that
10900 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20   the DISTINCT . 
10910 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65   ** clause is re
10920 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  dundant. */.  if
10930 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
10940 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
10950 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69    iBase = pTabLi
10960 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
10970 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  ;.  pTab = pTabL
10980 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
10990 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
109a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
109b0 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e  is an IPK column
109c0 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c   on table iBase,
109d0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20   then return .  
109e0 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54  ** true. Note: T
109f0 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  he (p->iTable==i
10a00 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68  Base) part of th
10a10 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66  is test may be f
10a20 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  alse if the.  **
10a30 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
10a40 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
10a50 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
10a60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
10a70 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
10a80 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
10a90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
10aa0 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69  ipCollate(pDisti
10ab0 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  nct->a[i].pExpr)
10ac0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
10ad0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
10ae0 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26  >iTable==iBase &
10af0 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  & p->iColumn<0 )
10b00 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
10b10 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
10b20 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e  h all indices on
10b30 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63   the table, chec
10b40 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65  king each to see
10b50 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a   if it makes.  *
10b60 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  * the DISTINCT q
10b70 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61  ualifier redunda
10b80 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69  nt. It does so i
10b90 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  f:.  **.  **   1
10ba0 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69  . The index is i
10bb0 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e  tself UNIQUE, an
10bc0 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  d.  **.  **   2.
10bd0 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75   All of the colu
10be0 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
10bf0 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74   are either part
10c00 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63   of the pDistinc
10c10 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74  t.  **      list
10c20 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48  , or else the WH
10c30 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
10c40 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  ins a term of th
10c50 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a  e form "col=X",.
10c60 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20    **      where 
10c70 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  X is a constant 
10c80 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61  value. The colla
10c90 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f  tion sequences o
10ca0 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  f the.  **      
10cb0 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73  comparison and s
10cc0 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65  elect-list expre
10cd0 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63  ssions must matc
10ce0 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69  h those of the i
10cf0 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
10d00 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73    3. All of thos
10d10 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  e index columns 
10d20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
10d30 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
10d40 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  not.  **      co
10d50 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20  ntain a "col=X" 
10d60 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74  term are subject
10d70 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63   to a NOT NULL c
10d80 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
10d90 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
10da0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
10db0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
10dc0 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  {.    if( pIdx->
10dd0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
10de0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10df0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
10e00 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
10e10 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
10e20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
10e30 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  [i];.      if( 0
10e40 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ==findTerm(pWC, 
10e50 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42  iBase, iCol, ~(B
10e60 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
10e70 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
10e80 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20    int iIdxCol = 
10e90 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
10ea0 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
10eb0 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b  iBase, pIdx, i);
10ec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64  .        if( iId
10ed0 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e  xCol<0 || pTab->
10ee0 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
10ef0 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d  umn[i]].notNull=
10f00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10f10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
10f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10f30 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e     if( i==pIdx->
10f40 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
10f50 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
10f60 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20  mplies that the 
10f70 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
10f80 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  er is redundant.
10f90 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
10fa0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
10fb0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
10fc0 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63 72  .** Prepare a cr
10fd0 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  ude estimate of 
10fe0 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
10ff0 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
11000 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  ..** The results
11010 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61   need not be exa
11020 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c  ct.  This is onl
11030 79 20 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d  y used for estim
11040 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74  ating.** the tot
11050 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f  al cost of perfo
11060 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  rming operations
11070 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72   with O(logN) or
11080 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d   O(NlogN).** com
11090 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75 73  plexity.  Becaus
110a0 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75  e N is just a gu
110b0 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72  ess, it is no gr
110c0 65 61 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a  eat tragedy if.*
110d0 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74  * logN is a litt
110e0 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  le off..*/.stati
110f0 63 20 57 68 65 72 65 43 6f 73 74 20 65 73 74 4c  c WhereCost estL
11100 6f 67 28 57 68 65 72 65 43 6f 73 74 20 4e 29 7b  og(WhereCost N){
11110 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6c 6f 67  .  WhereCost log
11120 4e 20 3d 20 31 3b 0a 20 20 57 68 65 72 65 43 6f  N = 1;.  WhereCo
11130 73 74 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69  st x = 10;.  whi
11140 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c  le( N>x ){.    l
11150 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20  ogN += 1;.    x 
11160 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74  *= 10;.  }.  ret
11170 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a  urn logN;.}../*.
11180 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
11190 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
111a0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
111b0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
111c0 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
111d0 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
111e0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
111f0 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
11200 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
11210 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
11220 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
11230 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
11240 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
11250 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
11260 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
11270 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
11280 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
11290 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63  _ENABLED).static
112a0 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
112b0 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
112c0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
112d0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
112e0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
112f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
11300 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
11310 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
11320 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
11330 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69  intf("  constrai
11340 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74  nt[%d]: col=%d t
11350 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75  ermid=%d op=%d u
11360 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20  sabled=%d\n",.  
11370 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
11380 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
11390 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
113a0 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
113b0 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a  i].iTermOffset,.
113c0 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
113d0 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20  raint[i].op,.   
113e0 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
113f0 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20  nt[i].usable);. 
11400 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
11410 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  p->nOrderBy; i++
11420 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
11430 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
11440 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  erby[%d]: col=%d
11450 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20   desc=%d\n",.   
11460 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
11470 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  >aOrderBy[i].iCo
11480 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
11490 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  aOrderBy[i].desc
114a0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
114b0 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f  void TRACE_IDX_O
114c0 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  UTPUTS(sqlite3_i
114d0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
114e0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
114f0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
11500 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
11510 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
11520 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
11530 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
11540 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64  intf("  usage[%d
11550 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d  ]: argvIdx=%d om
11560 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  it=%d\n",.      
11570 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
11580 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
11590 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20  ].argvIndex,.   
115a0 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
115b0 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29  ntUsage[i].omit)
115c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
115d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
115e0 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69  xNum=%d\n", p->i
115f0 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  dxNum);.  sqlite
11600 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
11610 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d  idxStr=%s\n", p-
11620 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
11630 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
11640 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65    orderByConsume
11650 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65  d=%d\n", p->orde
11660 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
11670 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
11680 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43  tf("  estimatedC
11690 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73  ost=%g\n", p->es
116a0 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a  timatedCost);.}.
116b0 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
116c0 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
116d0 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
116e0 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
116f0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
11700 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
11710 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
11720 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
11730 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
11740 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
11750 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
11760 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
11770 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
11780 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
11790 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
117a0 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
117b0 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
117c0 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
117d0 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
117e0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11800 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11810 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
11820 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
11830 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
11840 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
11850 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
11860 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
11870 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
11880 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
11890 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
118a0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
118b0 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
118c0 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
118d0 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
118e0 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
118f0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
11900 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d  rator & WO_EQ)==
11910 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11920 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
11930 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
11940 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  dy)!=0 ) return 
11950 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  0;.  if( pTerm->
11960 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29  u.leftColumn<0 )
11970 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66   return 0;.  aff
11980 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61   = pSrc->pTab->a
11990 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  Col[pTerm->u.lef
119a0 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  tColumn].affinit
119b0 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  y;.  if( !sqlite
119c0 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
119d0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61  (pTerm->pExpr, a
119e0 66 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ff) ) return 0;.
119f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
11a00 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
11a10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
11a20 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
11a30 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11a40 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
11a50 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  Index object for
11a60 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
11a70 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65  dex.** and to se
11a80 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65  t up the WhereLe
11a90 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65  vel object pLeve
11aa0 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  l so that the co
11ab0 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
11ac0 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65  makes use of the
11ad0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
11ae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11af0 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
11b00 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ticIndex(.  Pars
11b10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11b20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
11b30 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11b40 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
11b50 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
11b60 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
11b70 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
11b80 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
11b90 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
11ba0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
11bb0 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64  get the next ind
11bc0 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
11bd0 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
11be0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
11bf0 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
11c00 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
11c10 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
11c20 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f  Level          /
11c30 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65  * Write new inde
11c40 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  x here */.){.  i
11c50 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt nColumn;     
11c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11c70 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
11c80 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  in the construct
11c90 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  ed index */.  Wh
11ca0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
11cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
11cc0 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
11cd0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
11ce0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
11cf0 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  WCEnd;          
11d00 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
11d10 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  [] */.  int nByt
11d20 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
11d30 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 6d      /* Byte of m
11d40 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 66 6f 72  emory needed for
11d50 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
11d60 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
11d70 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
11d80 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
11d90 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
11da0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
11dd0 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
11de0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
11df0 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20  nt addrInit;    
11e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
11e10 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69  dress of the ini
11e20 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61  tialization bypa
11e30 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62  ss jump */.  Tab
11e40 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
11e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11e60 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
11e70 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  xed */.  KeyInfo
11e80 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20 20 20 20   *pKeyinfo;     
11e90 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f       /* Key info
11ea0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
11eb0 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20 20 69 6e  index */   .  in
11ec0 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
11ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
11ee0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66 69   of the index fi
11ef0 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ll loop */.  int
11f00 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
11f10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11f20 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20  ster holding an 
11f30 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
11f40 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f60 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20   Column counter 
11f70 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11fa0 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43   */.  int mxBitC
11fb0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
11fc0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c    /* Maximum col
11fd0 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c  umn in pSrc->col
11fe0 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  Used */.  CollSe
11ff0 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
12000 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
12010 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f  ng sequence to o
12020 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  n a column */.  
12030 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
12040 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
12050 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  he Loop object *
12060 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43  /.  Bitmask idxC
12070 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ols;            
12080 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c  /* Bitmap of col
12090 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e  umns used for in
120a0 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d  dexing */.  Bitm
120b0 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20  ask extraCols;  
120c0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
120d0 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  p of additional 
120e0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 6f 6e  columns */.  con
120f0 73 74 20 69 6e 74 20 6d 78 43 6f 6e 73 74 72 61  st int mxConstra
12100 69 6e 74 20 3d 20 31 30 3b 20 2f 2a 20 4d 61 78  int = 10; /* Max
12110 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
12120 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20  onstraints */.. 
12130 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
12140 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
12150 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
12160 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
12170 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
12180 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
12190 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
121a0 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
121b0 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
121c0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
121d0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
121e0 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
121f0 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
12200 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43  pParse);..  /* C
12210 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
12220 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
12230 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
12240 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
12250 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
12260 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
12270 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
12280 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70  nColumn = 0;.  p
12290 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
122a0 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
122b0 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
122c0 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
122d0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
122e0 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
122f0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
12300 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26   pTerm<pWCEnd &&
12310 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3c 6d   pLoop->nLTerm<m
12320 78 43 6f 6e 73 74 72 61 69 6e 74 3b 20 70 54 65  xConstraint; pTe
12330 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
12340 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
12350 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
12360 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
12370 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
12380 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
12390 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
123a0 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
123b0 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   ? MASKBIT(BMS-1
123c0 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c  ) : MASKBIT(iCol
123d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
123e0 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  e( iCol==BMS );.
123f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12400 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
12410 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
12420 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
12430 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65  .        if( whe
12440 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61  reLoopResize(pPa
12450 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20  rse->db, pLoop, 
12460 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 20 72 65 74  nColumn+1) ) ret
12470 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  urn;.        pLo
12480 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 43 6f 6c 75  op->aLTerm[nColu
12490 6d 6e 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  mn++] = pTerm;. 
124a0 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c         idxCols |
124b0 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  = cMask;.      }
124c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
124d0 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29  ert( nColumn>0 )
124e0 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
124f0 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  ee.nEq = pLoop->
12500 6e 4c 54 65 72 6d 20 3d 20 6e 43 6f 6c 75 6d 6e  nLTerm = nColumn
12510 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ;.  pLoop->wsFla
12520 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
12530 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58  N_EQ | WHERE_IDX
12540 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e  _ONLY | WHERE_IN
12550 44 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20  DEXED.          
12560 20 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45             | WHE
12570 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 0a  RE_TEMP_INDEX;..
12580 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
12590 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f  umber of additio
125a0 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  nal columns need
125b0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20  ed to create a. 
125c0 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   ** covering ind
125d0 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67  ex.  A "covering
125e0 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e   index" is an in
125f0 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
12600 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d  s all.  ** colum
12610 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64  ns that are need
12620 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e  ed by the query.
12630 20 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e    With a coverin
12640 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a  g index, the.  *
12650 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  * original table
12660 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
12670 62 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75  be accessed.  Au
12680 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20  tomatic indices 
12690 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63  must.  ** be a c
126a0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65  overing index be
126b0 63 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  cause the index 
126c0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
126d0 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  ted if the.  ** 
126e0 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63  original table c
126f0 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69  hanges and the i
12700 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63  ndex and table c
12710 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73  annot both be us
12720 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20  ed.  ** if they 
12730 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a  go out of sync..
12740 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73    */.  extraCols
12750 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
12760 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d   & (~idxCols | M
12770 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a  ASKBIT(BMS-1));.
12780 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70 54    mxBitCol = (pT
12790 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d  able->nCol >= BM
127a0 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70  S-1) ? BMS-1 : p
127b0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74  Table->nCol;.  t
127c0 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
127d0 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
127e0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
127f0 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20  le->nCol==BMS-2 
12800 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
12810 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
12820 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
12830 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
12840 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a   nColumn++;.  }.
12850 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
12860 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
12870 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  S-1) ){.    nCol
12880 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e  umn += pTable->n
12890 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20  Col - BMS + 1;. 
128a0 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   }.  pLoop->wsFl
128b0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
128c0 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49  UMN_EQ | WHERE_I
128d0 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a 20 43  DX_ONLY;..  /* C
128e0 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
128f0 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73  ex object to des
12900 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78  cribe this index
12910 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   */.  nByte = si
12920 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e  zeof(Index);.  n
12930 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a  Byte += nColumn*
12940 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20  sizeof(int);    
12950 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
12960 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d  mn */.  nByte +=
12970 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28   nColumn*sizeof(
12980 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64  char*);   /* Ind
12990 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e  ex.azColl */.  n
129a0 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b  Byte += nColumn;
129b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129c0 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
129d0 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d  rder */.  pIdx =
129e0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
129f0 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
12a00 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70   nByte);.  if( p
12a10 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Idx==0 ) return;
12a20 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
12a30 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
12a40 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
12a50 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b  = (char**)&pIdx[
12a60 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f  1];.  pIdx->aiCo
12a70 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
12a80 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75  dx->azColl[nColu
12a90 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f  mn];.  pIdx->aSo
12aa0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
12ab0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
12ac0 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d  Column];.  pIdx-
12ad0 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69  >zName = "auto-i
12ae0 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e  ndex";.  pIdx->n
12af0 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e  Column = nColumn
12b00 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ;.  pIdx->pTable
12b10 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d   = pTable;.  n =
12b20 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20   0;.  idxCols = 
12b30 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
12b40 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
12b50 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
12b60 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
12b70 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
12b80 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
12b90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
12ba0 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
12bb0 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
12bc0 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
12bd0 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42  Col>=BMS ? MASKB
12be0 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b  IT(BMS-1) : MASK
12bf0 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20  BIT(iCol);.     
12c00 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
12c10 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
12c20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
12c30 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
12c40 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
12c50 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20   cMask;.        
12c60 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
12c70 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ] = pTerm->u.lef
12c80 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
12c90 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
12ca0 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
12cb0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
12cc0 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
12cd0 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ht);.        pId
12ce0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41  x->azColl[n] = A
12cf0 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70  LWAYS(pColl) ? p
12d00 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42  Coll->zName : "B
12d10 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20  INARY";.        
12d20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
12d30 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
12d40 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e   (u32)n==pLoop->
12d50 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a  u.btree.nEq );..
12d60 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f    /* Add additio
12d70 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  nal columns need
12d80 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61  ed to make the a
12d90 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
12da0 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72  nto.  ** a cover
12db0 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66  ing index */.  f
12dc0 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
12dd0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
12de0 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41  ( extraCols & MA
12df0 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20  SKBIT(i) ){.    
12e00 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
12e10 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
12e20 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
12e30 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
12e40 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
12e50 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
12e60 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
12e70 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  S-1) ){.    for(
12e80 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c  i=BMS-1; i<pTabl
12e90 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
12ea0 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
12eb0 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
12ec0 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
12ed0 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
12ee0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
12ef0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d   }.  assert( n==
12f00 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a  nColumn );..  /*
12f10 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f   Create the auto
12f20 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  matic index */. 
12f30 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69   pKeyinfo = sqli
12f40 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
12f50 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
12f60 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
12f70 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20  >iIdxCur>=0 );. 
12f80 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
12f90 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
12fa0 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
12fb0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
12fc0 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76  nAutoindex, pLev
12fd0 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f  el->iIdxCur, nCo
12fe0 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20  lumn+1, 0,.     
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13000 63 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20  char*)pKeyinfo, 
13010 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
13020 46 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  FF);.  VdbeComme
13030 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c  nt((v, "for %s",
13040 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29   pTable->zName))
13050 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  ;..  /* Fill the
13060 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
13070 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f   with content */
13080 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
13090 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
130a0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65  , OP_Rewind, pLe
130b0 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20  vel->iTabCur);. 
130c0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
130d0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
130e0 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
130f0 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
13100 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  y(pParse, pIdx, 
13110 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
13120 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a   regRecord, 1);.
13130 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13140 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
13150 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
13160 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
13170 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
13180 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
13190 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
131a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
131b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
131c0 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
131d0 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  r, addrTop+1);. 
131e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
131f0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
13200 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
13210 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
13220 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
13230 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
13240 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
13250 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
13260 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  rd);.  .  /* Jum
13270 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
13280 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
13290 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
132a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
132b0 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d  (v, addrInit);.}
132c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
132d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
132e0 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  _INDEX */..#ifnd
132f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13300 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
13310 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
13320 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74  opulate an sqlit
13330 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
13340 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74  ructure. It is t
13350 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
13360 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
13370 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
13380 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74  y release the st
13390 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61  ructure.** by pa
133a0 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ssing the pointe
133b0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
133c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  is function to s
133d0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
133e0 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
133f0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c  _index_info *all
13400 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a  ocateIndexInfo(.
13410 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13420 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
13430 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72  pWC,.  struct Sr
13440 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
13450 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
13460 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20  rderBy.){.  int 
13470 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
13480 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
13490 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
134a0 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
134b0 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
134c0 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
134d0 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
134e0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
134f0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
13500 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
13510 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
13520 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
13530 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
13540 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
13550 3b 0a 0a 20 20 2f 2a 57 48 45 52 45 54 52 41 43  ;..  /*WHERETRAC
13560 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20  E(("Recomputing 
13570 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25  index info for %
13580 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  s...\n", pSrc->p
13590 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 2a 2f 0a  Tab->zName));*/.
135a0 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
135b0 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62  number of possib
135c0 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
135d0 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65  constraints refe
135e0 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  rring.  ** to th
135f0 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
13600 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72   */.  for(i=nTer
13610 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m=0, pTerm=pWC->
13620 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
13630 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
13640 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
13650 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
13660 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
13670 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
13680 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
13690 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
136a0 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b   & ~WO_EQUIV) );
136b0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
136c0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
136d0 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  & WO_IN );.    t
136e0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
136f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
13700 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  SNULL );.    if(
13710 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
13720 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20  r & (WO_ISNULL) 
13730 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13740 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
13750 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
13760 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13770 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  nTerm++;.  }..  
13780 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  /* If the ORDER 
13790 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  BY clause contai
137a0 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ns only columns 
137b0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  in the current .
137c0 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
137d0 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  le then allocate
137e0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
137f0 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a  OrderBy part of.
13800 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
13810 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
13820 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f  cture..  */.  nO
13830 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66  rderBy = 0;.  if
13840 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
13850 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72    int n = pOrder
13860 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  By->nExpr;.    f
13870 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
13880 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
13890 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
138a0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
138b0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
138c0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
138d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53  Expr->iTable!=pS
138e0 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72  rc->iCursor ) br
138f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
13900 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20  f( i==n){.      
13910 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20  nOrderBy = n;.  
13920 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
13930 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
13940 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
13950 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70  ructure.  */.  p
13960 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  IdxInfo = sqlite
13970 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
13980 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
13990 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20  (*pIdxInfo).    
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66         + (sizeof
139c0 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69  (*pIdxCons) + si
139d0 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e  zeof(*pUsage))*n
139e0 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20  Term.           
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72  + sizeof(*pIdxOr
13a10 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20  derBy)*nOrderBy 
13a20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  );.  if( pIdxInf
13a30 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  o==0 ){.    sqli
13a40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13a50 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  se, "out of memo
13a60 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ry");.    return
13a70 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   0;.  }..  /* In
13a80 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
13a90 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
13aa0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13ab0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
13ac0 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65  ns.  ** many fie
13ad0 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63  lds that are dec
13ae0 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f  lared "const" to
13af0 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e   prevent xBestIn
13b00 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68  dex from.  ** ch
13b10 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65  anging them.  We
13b20 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
13b30 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69   funky casting i
13b40 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
13b50 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65  initialize those
13b60 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20   fields..  */.  
13b70 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75  pIdxCons = (stru
13b80 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13b90 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49  _constraint*)&pI
13ba0 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64  dxInfo[1];.  pId
13bb0 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75  xOrderBy = (stru
13bc0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13bd0 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43  _orderby*)&pIdxC
13be0 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55  ons[nTerm];.  pU
13bf0 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73  sage = (struct s
13c00 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13c10 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26  straint_usage*)&
13c20 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64  pIdxOrderBy[nOrd
13c30 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29  erBy];.  *(int*)
13c40 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
13c50 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
13c60 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
13c70 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
13c80 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
13c90 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
13ca0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
13cb0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13cc0 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73  raint = pIdxCons
13cd0 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
13ce0 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
13cf0 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  by**)&pIdxInfo->
13d00 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f  aOrderBy = pIdxO
13d10 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
13d20 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13d30 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
13d40 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  e**)&pIdxInfo->a
13d50 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20  ConstraintUsage 
13d60 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13da0 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20       pUsage;..  
13db0 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
13dc0 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
13dd0 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
13de0 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b  m++){.    u8 op;
13df0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
13e00 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
13e10 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
13e20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
13e30 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
13e40 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
13e50 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
13e60 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
13e70 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13e80 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
13e90 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
13ea0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
13eb0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66  ISNULL );.    if
13ec0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13ed0 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29  or & (WO_ISNULL)
13ee0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13ef0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
13f00 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
13f10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13f20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
13f30 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
13f40 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
13f50 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
13f60 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
13f70 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
13f80 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
13f90 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
13fa0 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
13fb0 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  _EQ;.    pIdxCon
13fc0 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  s[j].op = op;.  
13fd0 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
13fe0 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
13ff0 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
14000 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
14010 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
14020 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
14030 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
14040 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
14050 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
14060 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
14070 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
14080 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
14090 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d   assert( WO_EQ==
140a0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
140b0 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20  STRAINT_EQ );.  
140c0 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d    assert( WO_LT=
140d0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
140e0 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20  NSTRAINT_LT );. 
140f0 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
14100 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14110 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
14120 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
14130 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
14140 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
14150 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
14160 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
14170 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
14180 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
14190 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
141a0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
141b0 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73  MATCH );.    ass
141c0 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
141d0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
141e0 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
141f0 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
14200 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
14210 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
14220 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
14230 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
14240 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
14250 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14260 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
14270 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
14280 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
14290 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
142a0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
142b0 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
142c0 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
142d0 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
142e0 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
142f0 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
14300 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
14310 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
14320 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
14330 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
14340 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
14350 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
14360 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
14370 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
14380 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
14390 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
143a0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69  3_index_info poi
143b0 6e 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61  nter passed.** a
143c0 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  s the argument..
143d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
143e0 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
143f0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
14400 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
14410 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
14420 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
14430 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
14440 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
14450 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
14460 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
14470 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14480 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
14490 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
144a0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
144b0 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
144c0 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
144d0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
144e0 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
144f0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14500 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
14510 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
14520 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
14530 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
14540 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
14550 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
14560 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
14570 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
14580 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
14590 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
145a0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
145b0 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
145c0 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
145d0 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
145e0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
145f0 63 3b 0a 0a 20 20 2f 2a 57 48 45 52 45 54 52 41  c;..  /*WHERETRA
14600 43 45 28 28 22 78 42 65 73 74 49 6e 64 65 78 20  CE(("xBestIndex 
14610 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d  for %s\n", pTab-
14620 3e 7a 4e 61 6d 65 29 29 3b 2a 2f 0a 20 20 54 52  >zName));*/.  TR
14630 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
14640 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d  );.  rc = pVtab-
14650 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49  >pModule->xBestI
14660 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a  ndex(pVtab, p);.
14670 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
14680 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72  UTS(p);..  if( r
14690 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
146a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
146b0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
146c0 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
146d0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
146e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
146f0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
14700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
14710 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14720 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
14730 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  tr(rc));.    }el
14740 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
14750 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14760 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a  , "%s", pVtab->z
14770 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  ErrMsg);.    }. 
14780 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
14790 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
147a0 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
147b0 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  Msg = 0;..  for(
147c0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
147d0 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
147e0 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72   if( !p->aConstr
147f0 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26  aint[i].usable &
14800 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  & p->aConstraint
14810 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
14820 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  ex>0 ){.      sq
14830 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14840 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
14850 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73   "table %s: xBes
14860 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20  tIndex returned 
14870 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22  an invalid plan"
14880 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14890 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
148a0 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
148b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
148c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
148d0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
148e0 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c   */...#ifdef SQL
148f0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14900 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
14910 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
14920 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
14930 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
14940 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
14950 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
14960 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
14970 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
14980 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
14990 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
149a0 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61  ws less than pVa
149b0 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  l.**    aStat[1]
149c0 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
149d0 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
149e0 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65  to pVal.**.** Re
149f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
14a00 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
14a10 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
14a20 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
14a30 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14a40 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
14a50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
14a60 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a80 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
14a90 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
14aa0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
14ab0 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a  *pVal,        /*
14ac0 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64   Value to consid
14ad0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
14ae0 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
14af0 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
14b00 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
14b10 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
14b20 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
14b30 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
14b40 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
14b50 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
14b60 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49    tRowcnt n;.  I
14b70 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
14b80 70 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54  ple;.  int i, eT
14b90 79 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20  ype;.  int isEq 
14ba0 3d 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  = 0;.  i64 v;.  
14bb0 57 68 65 72 65 43 6f 73 74 20 72 2c 20 72 53 3b  WhereCost r, rS;
14bc0 0a 0a 20 20 61 73 73 65 72 74 28 20 72 6f 75 6e  ..  assert( roun
14bd0 64 55 70 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55  dUp==0 || roundU
14be0 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  p==1 );.  assert
14bf0 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e  ( pIdx->nSample>
14c00 30 20 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d  0 );.  if( pVal=
14c10 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
14c20 54 45 5f 45 52 52 4f 52 3b 0a 20 20 6e 20 3d 20  TE_ERROR;.  n = 
14c30 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30  pIdx->aiRowEst[0
14c40 5d 3b 0a 20 20 61 53 61 6d 70 6c 65 20 3d 20 70  ];.  aSample = p
14c50 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20  Idx->aSample;.  
14c60 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  eType = sqlite3_
14c70 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
14c80 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
14c90 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
14ca0 7b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  {.    v = sqlite
14cb0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 56  3_value_int64(pV
14cc0 61 6c 29 3b 0a 20 20 20 20 72 20 3d 20 28 69 36  al);.    r = (i6
14cd0 34 29 76 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  4)v;.    for(i=0
14ce0 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ; i<pIdx->nSampl
14cf0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
14d00 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
14d10 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
14d20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14d30 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
14d40 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f  ].eType>=SQLITE_
14d50 54 45 58 54 20 29 20 62 72 65 61 6b 3b 0a 20 20  TEXT ) break;.  
14d60 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
14d70 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
14d80 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
14d90 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
14da0 69 5d 2e 75 2e 69 3e 3d 76 20 29 7b 0a 20 20 20  i].u.i>=v ){.   
14db0 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 61 53         isEq = aS
14dc0 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b  ample[i].u.i==v;
14dd0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
14de0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14e00 20 61 73 73 65 72 74 28 20 61 53 61 6d 70 6c 65   assert( aSample
14e10 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
14e20 45 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20  E_FLOAT );.     
14e30 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
14e40 5d 2e 75 2e 72 3e 3d 72 20 29 7b 0a 20 20 20 20  ].u.r>=r ){.    
14e50 20 20 20 20 20 20 69 73 45 71 20 3d 20 61 53 61        isEq = aSa
14e60 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a  mple[i].u.r==r;.
14e70 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14e90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
14ea0 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
14eb0 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
14ec0 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
14ed0 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a  e_double(pVal);.
14ee0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14ef0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  Idx->nSample; i+
14f00 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
14f10 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
14f20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f  SQLITE_NULL ) co
14f30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
14f40 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
14f50 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe>=SQLITE_TEXT 
14f60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
14f70 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
14f80 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
14f90 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72 53 20  T ){.        rS 
14fa0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72  = aSample[i].u.r
14fb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14fc0 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d         rS = aSam
14fd0 70 6c 65 5b 69 5d 2e 75 2e 69 3b 0a 20 20 20 20  ple[i].u.i;.    
14fe0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 53    }.      if( rS
14ff0 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=r ){.        i
15000 73 45 71 20 3d 20 72 53 3d 3d 72 3b 0a 20 20 20  sEq = rS==r;.   
15010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15020 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
15030 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c  e if( eType==SQL
15040 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
15050 69 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 61  i = 0;.    if( a
15060 53 61 6d 70 6c 65 5b 30 5d 2e 65 54 79 70 65 3d  Sample[0].eType=
15070 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69  =SQLITE_NULL ) i
15080 73 45 71 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  sEq = 1;.  }else
15090 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 54  {.    assert( eT
150a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
150b0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
150c0 45 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 66 6f  E_BLOB );.    fo
150d0 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
150e0 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
150f0 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
15100 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
15110 5f 54 45 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65  _TEXT || aSample
15120 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
15130 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  E_BLOB ){.      
15140 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
15150 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
15160 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
15170 7b 20 20 20 20 20 20 0a 20 20 20 20 20 20 73 71  {      .      sq
15180 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
15190 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f  se->db;.      Co
151a0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
151b0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b      const u8 *z;
151c0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
151d0 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  ==SQLITE_BLOB ){
151e0 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f  .        z = (co
151f0 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33  nst u8 *)sqlite3
15200 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c  _value_blob(pVal
15210 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  );.        pColl
15220 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
15230 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15240 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51  ( pColl->enc==SQ
15250 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20  LITE_UTF8 );.   
15260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15270 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
15280 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
15290 73 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  se, SQLITE_UTF8,
152a0 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c   0, *pIdx->azCol
152b0 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
152c0 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pColl==0 ){.    
152d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
152e0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
152f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d     }.        z =
15300 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c   (const u8 *)sql
15310 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
15320 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  al, pColl->enc);
15330 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 20  .        if( !z 
15340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
15350 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15360 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15370 20 20 20 20 61 73 73 65 72 74 28 20 7a 20 26 26      assert( z &&
15380 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
15390 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d  >xCmp );.      }
153a0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
153b0 65 33 56 61 6c 75 65 42 79 74 65 73 28 70 56 61  e3ValueBytes(pVa
153c0 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  l, pColl->enc);.
153d0 20 20 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69    .      for(; i
153e0 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
153f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
15400 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
15410 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d 20 61   eSampletype = a
15420 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b  Sample[i].eType;
15430 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 53 61  .        if( eSa
15440 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29  mpletype<eType )
15450 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
15460 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79     if( eSamplety
15470 70 65 21 3d 65 54 79 70 65 20 29 20 62 72 65 61  pe!=eType ) brea
15480 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  k;.#ifndef SQLIT
15490 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
154a0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e       if( pColl->
154b0 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc!=SQLITE_UTF8
154c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
154d0 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20  t nSample;.     
154e0 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70       char *zSamp
154f0 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  le = sqlite3Utf8
15500 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20 20  to16(.          
15510 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65      db, pColl->e
15520 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  nc, aSample[i].u
15530 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  .z, aSample[i].n
15540 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20  Byte, &nSample. 
15550 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
15560 20 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70        if( !zSamp
15570 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
15580 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
15590 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
155a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
155b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
155c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
155d0 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e       c = pColl->
155e0 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
155f0 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d  r, nSample, zSam
15600 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  ple, n, z);.    
15610 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
15620 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29  ree(db, zSample)
15630 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
15640 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
15650 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70  .          c = p
15660 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
15670 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65  ->pUser, aSample
15680 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70  [i].nByte, aSamp
15690 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29  le[i].u.z, n, z)
156a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
156b0 20 20 20 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a      if( c>=0 ){.
156c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
156d0 3d 30 20 29 20 69 73 45 71 20 3d 20 31 3b 0a 20  =0 ) isEq = 1;. 
156e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
156f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15700 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
15710 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
15720 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
15730 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
15740 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
15750 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75  than.  ** or equ
15760 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20  al to pVal.  Or 
15770 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
15780 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61  ple, then all sa
15790 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20  mples are less. 
157a0 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20   ** than pVal.  
157b0 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70  If aSample[i]==p
157c0 56 61 6c 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d  Val, then isEq==
157d0 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  1..  */.  if( is
157e0 45 71 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Eq ){.    assert
157f0 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
15800 65 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30  e );.    aStat[0
15810 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  ] = aSample[i].n
15820 4c 74 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  Lt;.    aStat[1]
15830 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45   = aSample[i].nE
15840 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  q;.  }else{.    
15850 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20  tRowcnt iLower, 
15860 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20  iUpper, iGap;.  
15870 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
15880 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a      iLower = 0;.
15890 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
158a0 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20  Sample[0].nLt;. 
158b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
158c0 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78  iUpper = i>=pIdx
158d0 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20  ->nSample ? n : 
158e0 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a  aSample[i].nLt;.
158f0 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
15900 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20  Sample[i-1].nEq 
15910 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  + aSample[i-1].n
15920 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  Lt;.    }.    aS
15930 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61  tat[1] = pIdx->a
15940 76 67 45 71 3b 0a 20 20 20 20 69 66 28 20 69 4c  vgEq;.    if( iL
15950 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a  ower>=iUpper ){.
15960 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a        iGap = 0;.
15970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15980 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d   iGap = iUpper -
15990 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20   iLower;.    }. 
159a0 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
159b0 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28  {.      iGap = (
159c0 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d  iGap*2)/3;.    }
159d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
159e0 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d   = iGap/3;.    }
159f0 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
15a00 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20  iLower + iGap;. 
15a10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
15a20 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
15a30 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
15a40 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT3 */../*.**
15a50 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   If expression p
15a60 45 78 70 72 20 72 65 70 72 65 73 65 6e 74 73 20  Expr represents 
15a70 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c  a literal value,
15a80 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
15a90 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74  t to.** an sqlit
15aa0 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
15ab0 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
15ac0 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69  e same value, wi
15ad0 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61  th affinity.** a
15ae0 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74  ff applied to it
15af0 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  , before returni
15b00 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ng. It is the re
15b10 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
15b20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74  the .** caller t
15b30 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
15b40 65 61 73 65 20 74 68 69 73 20 73 74 72 75 63 74  ease this struct
15b50 75 72 65 20 62 79 20 70 61 73 73 69 6e 67 20 69  ure by passing i
15b60 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  t to .** sqlite3
15b70 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a  ValueFree()..**.
15b80 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
15b90 74 20 70 61 72 73 65 20 69 73 20 61 20 72 65 63  t parse is a rec
15ba0 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52  ompile (sqlite3R
15bb0 65 70 72 65 70 61 72 65 28 29 29 20 61 6e 64 20  eprepare()) and 
15bc0 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53  pExpr.** is an S
15bd0 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  QL variable that
15be0 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
15bf0 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
15c00 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20  bound to it,.** 
15c10 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
15c20 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
15c30 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  e containing thi
15c40 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77  s value, again w
15c50 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  ith.** affinity 
15c60 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69  aff applied to i
15c70 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  t, instead..**.*
15c80 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20  * If neither of 
15c90 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c  the above apply,
15ca0 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c   set *pp to NULL
15cb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
15cc0 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
15cd0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
15ce0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
15cf0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65  ITE_OK..*/.#ifde
15d00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15d10 53 54 41 54 33 0a 73 74 61 74 69 63 20 69 6e 74  STAT3.static int
15d20 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a   valueFromExpr(.
15d30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15d40 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
15d50 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73   .  u8 aff, .  s
15d60 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
15d70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  p.){.  if( pExpr
15d80 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
15d90 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e  E.   || (pExpr->
15da0 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
15db0 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54  && pExpr->op2==T
15dc0 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20 29 7b  K_VARIABLE).  ){
15dd0 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20 3d 20  .    int iVar = 
15de0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
15df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
15e00 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
15e10 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a  ->pVdbe, iVar);.
15e20 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65      *pp = sqlite
15e30 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70 50  3VdbeGetValue(pP
15e40 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
15e50 2c 20 69 56 61 72 2c 20 61 66 66 29 3b 0a 20 20  , iVar, aff);.  
15e60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15e70 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
15e80 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f   sqlite3ValueFro
15e90 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  mExpr(pParse->db
15ea0 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f  , pExpr, SQLITE_
15eb0 55 54 46 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a  UTF8, aff, pp);.
15ec0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
15ed0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15ee0 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74   used to estimat
15ef0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
15f00 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
15f10 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  e visited.** by 
15f20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65  scanning an inde
15f30 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66  x for a range of
15f40 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e   values. The ran
15f50 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75  ge may have an u
15f60 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61  pper.** bound, a
15f70 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72   lower bound, or
15f80 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45   both. The WHERE
15f90 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
15fa0 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72  at set the upper
15fb0 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  .** and lower bo
15fc0 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65  unds are represe
15fd0 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61  nted by pLower a
15fe0 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63  nd pUpper respec
15ff0 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65  tively. For.** e
16000 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
16010 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73   that index p is
16020 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a   on t1(a):.**.**
16030 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
16040 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
16050 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20   < ? ....**     
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16070 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c  _____|   |_____|
16080 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16090 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
160a0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
160c0 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a  wer    pUpper.**
160d0 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
160e0 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f   the upper or lo
160f0 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74  wer bound is not
16100 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e   present, then N
16110 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e  ULL is passed in
16120 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65  .** place of the
16130 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
16140 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
16150 54 68 65 20 6e 45 71 20 70 61 72 61 6d 65 74 65  The nEq paramete
16160 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20  r is passed the 
16170 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69 6e 64  index of the ind
16180 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63  ex column subjec
16190 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67  t to the.** rang
161a0 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72  e constraint. Or
161b0 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20  , equivalently, 
161c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 71  the number of eq
161d0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
161e0 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20  ts.** optimized 
161f0 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20  by the proposed 
16200 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20  index scan. For 
16210 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
16220 67 20 69 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20  g index p is.** 
16230 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64  on t1(a, b), and
16240 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   the SQL query i
16250 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
16260 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
16270 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44   ? AND b > ? AND
16280 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   b < ? ....**.**
16290 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64   then nEq should
162a0 20 62 65 20 70 61 73 73 65 64 20 74 68 65 20 76   be passed the v
162b0 61 6c 75 65 20 31 20 28 61 73 20 74 68 65 20 72  alue 1 (as the r
162c0 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
162d0 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73  column,.** b, is
162e0 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74   the second left
162f0 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
16300 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20  the index). Or, 
16310 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
16320 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
16330 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
16340 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
16350 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68  *.** then nEq sh
16360 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 30  ould be passed 0
16370 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
16380 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 61 6e  rned value is an
16390 20 69 6e 74 65 67 65 72 20 64 69 76 69 73 6f 72   integer divisor
163a0 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 65   to reduce the e
163b0 73 74 69 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72  stimated.** sear
163c0 63 68 20 73 70 61 63 65 2e 20 20 41 20 72 65 74  ch space.  A ret
163d0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31 20 6d  urn value of 1 m
163e0 65 61 6e 73 20 74 68 61 74 20 72 61 6e 67 65 20  eans that range 
163f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a  constraints are.
16400 2a 2a 20 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c  ** no help at al
16410 6c 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c  l.  A return val
16420 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 72 61  ue of 2 means ra
16430 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
16440 61 72 65 0a 2a 2a 20 65 78 70 65 63 74 65 64 20  are.** expected 
16450 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65  to reduce the se
16460 61 72 63 68 20 73 70 61 63 65 20 62 79 20 68 61  arch space by ha
16470 6c 66 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  lf.  And so fort
16480 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  h....**.** In th
16490 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
164a0 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a  ite_stat3 ANALYZ
164b0 45 20 64 61 74 61 2c 20 65 61 63 68 20 72 61 6e  E data, each ran
164c0 67 65 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a  ge inequality.**
164d0 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
164e0 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
164f0 61 63 74 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e  actor of 4.  Hen
16500 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73  ce a single cons
16510 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20  traint (x>?).** 
16520 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72 65 74  results in a ret
16530 75 72 6e 20 6f 66 20 34 20 61 6e 64 20 61 20 72  urn of 4 and a r
16540 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
16550 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
16560 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65  sults.** in a re
16570 74 75 72 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73  turn of 16..*/.s
16580 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
16590 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50  angeScanEst(.  P
165a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
165b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
165c0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
165d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
165e0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
165f0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
16600 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
16610 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f  ange-compared co
16620 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69  lumn; "x" */.  i
16630 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20  nt nEq,         
16640 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74      /* index int
16650 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74  o p->aCol[] of t
16660 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65  he range-compare
16670 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68  d column */.  Wh
16680 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
16690 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
166a0 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
166b0 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
166c0 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
166d0 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
166e0 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
166f0 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
16700 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
16710 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
16720 57 68 65 72 65 43 6f 73 74 20 2a 70 52 61 6e 67  WhereCost *pRang
16730 65 44 69 76 20 2f 2a 20 4f 55 54 3a 20 52 65 64  eDiv /* OUT: Red
16740 75 63 65 20 73 65 61 72 63 68 20 73 70 61 63 65  uce search space
16750 20 62 79 20 74 68 69 73 20 64 69 76 69 73 6f 72   by this divisor
16760 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
16770 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69  = SQLITE_OK;..#i
16780 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
16790 4c 45 5f 53 54 41 54 33 0a 0a 20 20 69 66 28 20  LE_STAT3..  if( 
167a0 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e 53 61  nEq==0 && p->nSa
167b0 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  mple ){.    sqli
167c0 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e 67  te3_value *pRang
167d0 65 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77 63 6e  eVal;.    tRowcn
167e0 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20  t iLower = 0;.  
167f0 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
16800 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30   = p->aiRowEst[0
16810 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 61  ];.    tRowcnt a
16820 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66 20  [2];.    u8 aff 
16830 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  = p->pTable->aCo
16840 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  l[p->aiColumn[0]
16850 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20  ].affinity;..   
16860 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
16870 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
16880 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
16890 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
168a0 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
168b0 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
168c0 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61  , aff, &pRangeVa
168d0 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
168e0 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72  ( (pLower->eOper
168f0 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f  ator & (WO_GT|WO
16900 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _GE))!=0 );.    
16910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16920 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68  _OK.       && wh
16930 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
16940 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c  se, p, pRangeVal
16950 2c 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f  , 0, a)==SQLITE_
16960 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  OK.      ){.    
16970 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30      iLower = a[0
16980 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ];.        if( (
16990 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
169a0 72 20 26 20 57 4f 5f 47 54 29 21 3d 30 20 29 20  r & WO_GT)!=0 ) 
169b0 69 4c 6f 77 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a  iLower += a[1];.
169c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
169d0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
169e0 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d  RangeVal);.    }
169f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16a00 49 54 45 5f 4f 4b 20 26 26 20 70 55 70 70 65 72  ITE_OK && pUpper
16a10 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
16a20 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e  pExpr = pUpper->
16a30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
16a40 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46       rc = valueF
16a50 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
16a60 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52 61  pExpr, aff, &pRa
16a70 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20 20 61  ngeVal);.      a
16a80 73 73 65 72 74 28 20 28 70 55 70 70 65 72 2d 3e  ssert( (pUpper->
16a90 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
16aa0 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b  LT|WO_LE))!=0 );
16ab0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
16ac0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
16ad0 26 26 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  && whereKeyStats
16ae0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 61 6e  (pParse, p, pRan
16af0 67 65 56 61 6c 2c 20 31 2c 20 61 29 3d 3d 53 51  geVal, 1, a)==SQ
16b00 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b  LITE_OK.      ){
16b10 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
16b20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  = a[0];.        
16b30 69 66 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70  if( (pUpper->eOp
16b40 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
16b50 3d 30 20 29 20 69 55 70 70 65 72 20 2b 3d 20 61  =0 ) iUpper += a
16b60 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [1];.      }.   
16b70 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
16b80 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a  ree(pRangeVal);.
16b90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16ba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16bb0 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3c       if( iUpper<
16bc0 3d 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20  =iLower ){.     
16bd0 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20     *pRangeDiv = 
16be0 28 57 68 65 72 65 43 6f 73 74 29 70 2d 3e 61 69  (WhereCost)p->ai
16bf0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20  RowEst[0];.     
16c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16c10 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28 57 68  *pRangeDiv = (Wh
16c20 65 72 65 43 6f 73 74 29 70 2d 3e 61 69 52 6f 77  ereCost)p->aiRow
16c30 45 73 74 5b 30 5d 2f 28 57 68 65 72 65 43 6f 73  Est[0]/(WhereCos
16c40 74 29 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  t)(iUpper - iLow
16c50 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
16c60 20 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28     /*WHERETRACE(
16c70 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67  ("range scan reg
16c80 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64 69  ions: %u..%u  di
16c90 76 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20  v=%g\n",.       
16ca0 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
16cb0 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
16cc0 70 65 72 2c 20 2a 70 52 61 6e 67 65 44 69 76 29  per, *pRangeDiv)
16cd0 29 3b 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  );*/.      retur
16ce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
16cf0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
16d00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16d10 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45  pParse);.  UNUSE
16d20 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
16d30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
16d40 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a  ER(nEq);.#endif.
16d50 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
16d60 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20   || pUpper );.  
16d70 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28 57 68  *pRangeDiv = (Wh
16d80 65 72 65 43 6f 73 74 29 31 3b 0a 20 20 69 66 28  ereCost)1;.  if(
16d90 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f 77   pLower && (pLow
16da0 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  er->wtFlags & TE
16db0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a  RM_VNULL)==0 ) *
16dc0 70 52 61 6e 67 65 44 69 76 20 2a 3d 20 28 57 68  pRangeDiv *= (Wh
16dd0 65 72 65 43 6f 73 74 29 34 3b 0a 20 20 69 66 28  ereCost)4;.  if(
16de0 20 70 55 70 70 65 72 20 29 20 2a 70 52 61 6e 67   pUpper ) *pRang
16df0 65 44 69 76 20 2a 3d 20 28 57 68 65 72 65 43 6f  eDiv *= (WhereCo
16e00 73 74 29 34 3b 0a 20 20 72 65 74 75 72 6e 20 72  st)4;.  return r
16e10 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
16e20 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
16e30 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
16e40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16e50 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
16e60 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
16e70 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
16e80 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
16e90 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
16ea0 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
16eb0 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
16ec0 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
16ed0 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
16ee0 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
16ef0 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
16f00 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
16f10 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
16f20 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
16f30 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
16f40 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
16f50 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
16f60 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
16f70 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
16f80 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
16f90 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
16fa0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
16fb0 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
16fc0 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
16fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16fe0 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
16ff0 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
17000 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
17010 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
17020 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
17030 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
17040 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
17050 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
17060 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
17070 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
17080 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
17090 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
170a0 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
170b0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
170c0 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
170d0 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
170e0 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
170f0 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
17100 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
17110 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
17120 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17130 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
17140 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
17150 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
17160 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
17170 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
17180 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
17190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
171a0 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
171b0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
171c0 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
171d0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
171e0 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
171f0 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
17200 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
17210 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  nt */.  WhereCos
17220 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 2f 2a 20  t *pnRow     /* 
17230 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
17240 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
17250 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
17260 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20  te3_value *pRhs 
17270 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f  = 0;  /* VALUE o
17280 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
17290 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20  e of pTerm */.  
172a0 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
172b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
172c0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
172d0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
172e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
172f0 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
17300 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
17310 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
17320 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
17330 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ics */..  assert
17340 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
17350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17360 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
17370 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
17380 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
17390 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  [0]].affinity;. 
173a0 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
173b0 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
173c0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
173d0 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29 3b  pr, aff, &pRhs);
173e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
173f0 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  to whereEqualSca
17400 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d  nEst_cancel;.  }
17410 65 6c 73 65 7b 0a 20 20 20 20 70 52 68 73 20 3d  else{.    pRhs =
17420 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
17430 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
17440 7d 0a 20 20 69 66 28 20 70 52 68 73 3d 3d 30 20  }.  if( pRhs==0 
17450 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
17460 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d  NOTFOUND;.  rc =
17470 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
17480 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20  Parse, p, pRhs, 
17490 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, a);.  if( rc=
174a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
174b0 20 20 2f 2a 57 48 45 52 45 54 52 41 43 45 28 28    /*WHERETRACE((
174c0 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
174d0 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
174e0 69 6e 74 29 61 5b 31 5d 29 29 3b 2a 2f 0a 20 20  int)a[1]));*/.  
174f0 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
17500 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61 6c 53  .  }.whereEqualS
17510 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a 0a 20  canEst_cancel:. 
17520 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
17530 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74 75 72  e(pRhs);.  retur
17540 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
17550 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
17560 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a  _ENABLE_STAT3) *
17570 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
17580 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a  _ENABLE_STAT3./*
17590 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
175a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
175b0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
175c0 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
175d0 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
175e0 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
175f0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
17600 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
17610 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
17620 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
17630 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
17640 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
17650 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
17660 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
17670 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
17680 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
17690 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
176a0 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
176b0 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
176c0 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
176d0 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
176e0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
176f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
17700 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
17710 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
17720 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
17730 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
17740 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
17750 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
17760 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
17770 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
17780 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
17790 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
177a0 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
177b0 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
177c0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
177d0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
177e0 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
177f0 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
17800 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
17810 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
17820 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
17830 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
17840 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
17850 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
17860 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
17870 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20  n is pTerm */.  
17880 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
17890 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
178a0 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48  e list on the RH
178b0 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76  S of "x IN (v1,v
178c0 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20  2,v3,...)" */.  
178d0 57 68 65 72 65 43 6f 73 74 20 2a 70 6e 52 6f 77  WhereCost *pnRow
178e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
178f0 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
17900 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
17910 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17920 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
17930 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
17940 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
17950 57 68 65 72 65 43 6f 73 74 20 6e 45 73 74 3b 20  WhereCost nEst; 
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17970 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
17980 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
17990 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  rm */.  WhereCos
179a0 74 20 6e 52 6f 77 45 73 74 20 3d 20 28 57 68 65  t nRowEst = (Whe
179b0 72 65 43 6f 73 74 29 30 3b 20 2f 2a 20 4e 65 77  reCost)0; /* New
179c0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
179d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
179e0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17a10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
17a20 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
17a30 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
17a40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
17a50 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
17a60 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e  {.    nEst = p->
17a70 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
17a80 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
17a90 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
17aa0 70 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  p, pList->a[i].p
17ab0 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20  Expr, &nEst);.  
17ac0 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73    nRowEst += nEs
17ad0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  t;.  }.  if( rc=
17ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17af0 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20    if( nRowEst > 
17b00 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29  p->aiRowEst[0] )
17b10 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69   nRowEst = p->ai
17b20 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a  RowEst[0];.    *
17b30 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
17b40 0a 20 20 20 20 2f 2a 57 48 45 52 45 54 52 41 43  .    /*WHERETRAC
17b50 45 28 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  E(("IN row estim
17b60 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20  ate: est=%g\n", 
17b70 6e 52 6f 77 45 73 74 29 29 3b 2a 2f 0a 20 20 7d  nRowEst));*/.  }
17b80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17b90 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
17ba0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
17bb0 53 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  STAT3) */../*.**
17bc0 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
17bd0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
17be0 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
17bf0 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
17c00 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
17c10 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
17c20 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
17c30 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
17c40 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
17c50 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
17c60 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
17c70 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
17c80 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
17c90 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
17ca0 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
17cb0 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
17cc0 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
17cd0 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
17ce0 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
17cf0 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
17d00 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
17d10 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
17d20 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
17d30 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
17d40 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
17d50 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
17d60 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
17d70 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
17d80 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
17d90 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
17da0 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
17db0 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
17dc0 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
17dd0 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
17de0 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
17df0 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
17e00 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
17e10 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
17e20 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
17e30 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
17e40 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
17e50 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35  OF: R-24597-5865
17e60 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64  5 No tests are d
17e70 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68  one for terms th
17e80 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65  at are.** comple
17e90 74 65 6c 79 20 73 61 74 69 73 66 69 65 64 20 62  tely satisfied b
17ea0 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  y indices..**.**
17eb0 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
17ec0 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
17ed0 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
17ee0 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
17ef0 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
17f00 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
17f10 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
17f20 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73  ion.  When terms
17f30 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
17f40 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65  * by indices, we
17f50 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f   disable them to
17f60 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61   prevent redunda
17f70 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20  nt tests in the 
17f80 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20  inner.** loop.  
17f90 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65  We would get the
17fa0 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73   correct results
17fb0 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65   if nothing were
17fc0 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a   ever disabled,.
17fd0 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67  ** but joins mig
17fe0 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
17ff0 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69  slower.  The tri
18000 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65  ck is to disable
18010 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77   as much.** as w
18020 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69  e can without di
18030 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68  sabling too much
18040 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65  .  If we disable
18050 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67  d in (1), we'd g
18060 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20  et.** the wrong 
18070 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63  answer.  See tic
18080 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61  ket #813..*/.sta
18090 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
180a0 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
180b0 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65  *pLevel, WhereTe
180c0 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66  rm *pTerm){.  if
180d0 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26  ( pTerm.      &&
180e0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
180f0 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
18100 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  0.      && (pLev
18110 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
18120 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
18130 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
18140 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
18150 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
18160 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
18170 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70  CODED;.    if( p
18180 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  Term->iParent>=0
18190 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
181a0 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
181b0 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65  Term->pWC->a[pTe
181c0 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
181d0 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65      if( (--pOthe
181e0 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b  r->nChild)==0 ){
181f0 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
18200 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74  Term(pLevel, pOt
18210 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  her);.      }.  
18220 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
18230 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69   Code an OP_Affi
18240 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61  nity opcode to a
18250 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pply the column 
18260 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
18270 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  zAff.** to the n
18280 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
18290 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a  ing at base. .**
182a0 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69  .** As an optimi
182b0 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41  zation, SQLITE_A
182c0 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
182d0 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70  (which are no-op
182e0 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67  s) at the.** beg
182f0 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f  inning and end o
18300 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72  f zAff are ignor
18310 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72  ed.  If all entr
18320 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a  ies in zAff are.
18330 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
18340 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65  NE, then no code
18350 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e   gets generated.
18360 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18370 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77  ine makes its ow
18380 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73  n copy of zAff s
18390 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  o that the calle
183a0 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20  r is free.** to 
183b0 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65  modify zAff afte
183c0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
183d0 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  eturns..*/.stati
183e0 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79  c void codeApply
183f0 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
18400 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65  pParse, int base
18410 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a  , int n, char *z
18420 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Aff){.  Vdbe *v 
18430 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18440 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29  .  if( zAff==0 )
18450 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
18460 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
18470 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
18480 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
18490 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f  rt( v!=0 );..  /
184a0 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e  * Adjust base an
184b0 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  d n to skip over
184c0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
184d0 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20   entries at the 
184e0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61  beginning.  ** a
184f0 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66  nd end of the af
18500 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20  finity string.. 
18510 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30   */.  while( n>0
18520 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c   && zAff[0]==SQL
18530 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
18540 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73      n--;.    bas
18550 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b  e++;.    zAff++;
18560 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e  .  }.  while( n>
18570 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d  1 && zAff[n-1]==
18580 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
18590 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a  ){.    n--;.  }.
185a0 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f  .  /* Code the O
185b0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
185c0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
185d0 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64  ything left to d
185e0 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20  o. */.  if( n>0 
185f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
18600 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
18610 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e  ffinity, base, n
18620 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18630 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
18640 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20  , zAff, n);.    
18650 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18660 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
18670 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
18680 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
18690 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
186a0 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
186b0 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
186c0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
186d0 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
186e0 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
186f0 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
18700 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
18710 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
18720 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
18730 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
18740 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
18750 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
18760 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
18770 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
18780 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
18790 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
187a0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
187b0 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
187c0 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
187d0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
187e0 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
187f0 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
18800 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
18810 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
18820 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
18830 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
18840 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
18850 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
18860 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20  EqualityTerm(.  
18870 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18880 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
18890 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
188a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
188b0 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20  ,   /* The term 
188c0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
188d0 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20  use to be coded 
188e0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
188f0 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20  *pLevel, /* The 
18900 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
18910 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
18920 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
18930 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20  int iEq,        
18940 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
18950 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
18960 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65  m within this le
18970 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  vel */.  int bRe
18980 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v,           /* 
18990 54 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65  True for reverse
189a0 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74  -order IN operat
189b0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
189c0 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a  arget         /*
189d0 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76   Attempt to leav
189e0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69  e results in thi
189f0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
18a00 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
18a10 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64  erm->pExpr;.  Vd
18a20 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
18a30 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65  pVdbe;.  int iRe
18a40 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
18a50 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
18a60 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20  holding results 
18a70 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54  */..  assert( iT
18a80 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28  arget>0 );.  if(
18a90 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
18aa0 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  {.    iReg = sql
18ab0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
18ac0 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  et(pParse, pX->p
18ad0 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
18ae0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d  .  }else if( pX-
18af0 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
18b00 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
18b10 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rget;.    sqlite
18b20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18b30 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
18b40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18b50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
18b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
18b70 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69  eType;.    int i
18b80 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
18b90 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
18ba0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
18bb0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
18bc0 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c  op;..    if( (pL
18bd0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
18be0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
18bf0 45 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70  E)==0.      && p
18c00 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
18c10 6e 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26  ndex!=0.      &&
18c20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
18c30 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
18c40 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20  er[iEq].    ){. 
18c50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
18c60 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  Eq==0 );.      t
18c70 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 70 4c  estcase( iEq==pL
18c80 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
18c90 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 20 29 3b 0a  x->nColumn-1 );.
18ca0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18cb0 69 45 71 3e 30 20 26 26 20 69 45 71 2b 31 3c 70  iEq>0 && iEq+1<p
18cc0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
18cd0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  dx->nColumn );. 
18ce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
18cf0 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
18d00 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
18d10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
18d20 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
18d30 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
18d40 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71  ;.    eType = sq
18d50 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
18d60 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b  (pParse, pX, 0);
18d70 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
18d80 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
18d90 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74 65 73  ESC ){.      tes
18da0 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20  tcase( bRev );. 
18db0 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65       bRev = !bRe
18dc0 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61  v;.    }.    iTa
18dd0 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a  b = pX->iTable;.
18de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18df0 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20  ddOp2(v, bRev ? 
18e00 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77  OP_Last : OP_Rew
18e10 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
18e20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
18e30 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
18e40 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20  RE_MULTI_OR)==0 
18e50 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  );.    pLoop->ws
18e60 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
18e70 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20  N_ABLE;.    if( 
18e80 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
18e90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
18ea0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
18eb0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18ec0 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  bel(v);.    }.  
18ed0 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
18ee0 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c  In++;.    pLevel
18ef0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d  ->u.in.aInLoop =
18f00 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  .       sqlite3D
18f10 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
18f20 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65  Parse->db, pLeve
18f30 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c  l->u.in.aInLoop,
18f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18f60 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e  izeof(pLevel->u.
18f70 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70  in.aInLoop[0])*p
18f80 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29  Level->u.in.nIn)
18f90 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76  ;.    pIn = pLev
18fa0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
18fb0 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b  ;.    if( pIn ){
18fc0 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c  .      pIn += pL
18fd0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d  evel->u.in.nIn -
18fe0 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69   1;.      pIn->i
18ff0 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Cur = iTab;.    
19000 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
19010 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
19020 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72         pIn->addr
19030 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  InTop = sqlite3V
19040 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19050 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65  Rowid, iTab, iRe
19060 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
19070 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
19080 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
19090 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
190a0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
190b0 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  0, iReg);.      
190c0 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e  }.      pIn->eEn
190d0 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f  dLoopOp = bRev ?
190e0 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
190f0 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
19100 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
19110 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b  P_IsNull, iReg);
19120 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19130 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
19140 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  In = 0;.    }.#e
19150 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62  ndif.  }.  disab
19160 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
19170 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  Term);.  return 
19180 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iReg;.}../*.** G
19190 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
191a0 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
191b0 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f  all == and IN co
191c0 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e  nstraints for an
191d0 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  .** index..**.**
191e0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f   For example, co
191f0 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28  nsider table t1(
19200 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74  a,b,c,d,e,f) wit
19210 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63  h index i1(a,b,c
19220 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  )..** Suppose th
19230 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
19240 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e  s this:  a==5 AN
19250 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41  D b IN (1,2,3) A
19260 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a  ND c>5 AND c<10.
19270 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73  ** The index has
19280 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65   as many as thre
19290 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
192a0 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74  raints, but in t
192b0 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  his.** example, 
192c0 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61  the third "c" va
192d0 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61  lue is an inequa
192e0 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74  lity.  So only t
192f0 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  wo .** constrain
19300 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54  ts are coded.  T
19310 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
19320 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
19330 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d  o evaluate.** a=
19340 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32  =5 and b IN (1,2
19350 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e  ,3).  The curren
19360 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61  t values for a a
19370 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f  nd b will be sto
19380 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63  red.** in consec
19390 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20  utive registers 
193a0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66  and the index of
193b0 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
193c0 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ter is returned.
193d0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
193e0 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d  ample above nEq=
193f0 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75  =2.  But this su
19400 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66  broutine works f
19410 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20  or any value.** 
19420 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67  of nEq including
19430 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20   0.  If nEq==0, 
19440 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
19450 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a  nearly a no-op..
19460 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  ** The only thin
19470 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c  g it does is all
19480 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c  ocate the pLevel
19490 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65  ->iMem memory ce
194a0 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74  ll and.** comput
194b0 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  e the affinity s
194c0 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
194d0 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73  s routine always
194e0 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65   allocates at le
194f0 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63  ast one memory c
19500 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a  ell and returns.
19510 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ** the index of 
19520 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
19530 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a  . The code that.
19540 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  ** calls this ro
19550 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74  utine will use t
19560 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  hat memory cell 
19570 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72  to store the ter
19580 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20  mination.** key 
19590 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  value of the loo
195a0 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f  p.  If one or mo
195b0 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  re IN operators 
195c0 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20  appear, then.** 
195d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  this routine all
195e0 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69  ocates an additi
195f0 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20  onal nEq memory 
19600 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e  cells for intern
19610 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  al.** use..**.**
19620 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
19630 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74  g, *pzAff is set
19640 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
19650 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
19660 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68   a.** copy of th
19670 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
19680 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20  y string of the 
19690 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20  index allocated 
196a0 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
196b0 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65  DbMalloc(). Exce
196c0 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74  pt, entries in t
196d0 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  he copy of the s
196e0 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64  tring associated
196f0 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74  .** with equalit
19700 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  y constraints th
19710 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69  at use NONE affi
19720 6e 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a  nity are set to.
19730 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
19740 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64  NE. This is to d
19750 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63  eal with SQL suc
19760 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h as the followi
19770 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ng:.**.**   CREA
19780 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45  TE TABLE t1(a TE
19790 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  XT PRIMARY KEY, 
197a0 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  b);.**   SELECT 
197b0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74  ... FROM t1 AS t
197c0 32 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61  2, t1 WHERE t1.a
197d0 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49   = t2.b;.**.** I
197e0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
197f0 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f  ove, the index o
19800 6e 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54  n t1(a) has TEXT
19810 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73   affinity. But s
19820 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68  ince.** the righ
19830 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t hand side of t
19840 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
19850 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61  traint (t2.b) ha
19860 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c  s NONE affinity,
19870 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  .** no conversio
19880 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65  n should be atte
19890 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69  mpted before usi
198a0 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20  ng a t2.b value 
198b0 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  as part of.** a 
198c0 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68  key to search th
198d0 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74  e index. Hence t
198e0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e  he first byte in
198f0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66   the returned af
19900 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67  finity.** string
19910 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65   in this example
19920 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f   would be set to
19930 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
19940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19950 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
19960 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70  erms(.  Parse *p
19970 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
19980 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
19990 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
199a0 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57   *pLevel,   /* W
199b0 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70  hich nested loop
199c0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20   of the FROM we 
199d0 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  are coding */.  
199e0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
199f0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
19a00 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42  RE clause */.  B
19a10 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
19a20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61       /* Which pa
19a30 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65  rts of FROM have
19a40 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
19a50 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ded */.  int bRe
19a60 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v,             /
19a70 2a 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72  * Reverse the or
19a80 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  der of IN operat
19a90 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ors */.  int nEx
19aa0 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f  traReg,        /
19ab0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
19ac0 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  a registers to a
19ad0 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
19ae0 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20  r **pzAff       
19af0 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74     /* OUT: Set t
19b00 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e  o point to affin
19b10 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
19b20 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20  .  int nEq;     
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b40 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
19b50 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
19b60 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a  raints to code *
19b70 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
19b80 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
19b90 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65    /* The vm unde
19ba0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
19bb0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bd0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
19be0 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
19bf0 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  is loop */.  Whe
19c00 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
19c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19c20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
19c30 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72  t term */.  Wher
19c40 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
19c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19c60 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
19c70 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  t */.  int j;   
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c90 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
19ca0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
19cb0 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
19cc0 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
19cd0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
19ce0 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20  t nReg;         
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19d00 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65  umber of registe
19d10 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
19d20 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20  /.  char *zAff; 
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d40 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
19d50 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a  ring to return *
19d60 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64  /..  /* This mod
19d70 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ule is only call
19d80 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e  ed on query plan
19d90 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e  s that use an in
19da0 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20  dex. */.  pLoop 
19db0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
19dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f  ;.  assert( (pLo
19dd0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19de0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
19df0 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20  )==0 );.  nEq = 
19e00 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
19e10 45 71 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f  Eq;.  pIdx = pLo
19e20 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
19e30 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ex;.  assert( pI
19e40 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46  dx!=0 );..  /* F
19e50 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
19e60 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ny memory cells 
19e70 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65  we will need the
19e80 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e  n allocate them.
19e90 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20  .  */.  regBase 
19ea0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
19eb0 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f   1;.  nReg = pLo
19ec0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
19ed0 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70  + nExtraReg;.  p
19ee0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
19ef0 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73  Reg;..  zAff = s
19f00 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
19f10 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74  Parse->db, sqlit
19f20 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
19f30 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20  tr(v, pIdx));.  
19f40 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20  if( !zAff ){.   
19f50 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
19f60 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
19f70 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74   }..  /* Evaluat
19f80 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  e the equality c
19f90 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
19fa0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
19fb0 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a  nColumn>=nEq );.
19fc0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71    for(j=0; j<nEq
19fd0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; j++){.    int 
19fe0 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  r1;.    pTerm = 
19ff0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1a000 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1a010 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a  erm!=0 );.    /*
1a020 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1a030 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20  rue for indices 
1a040 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63  with redundant c
1a050 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20  olumns. .    ** 
1a060 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58  Ex: CREATE INDEX
1a070 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29   i1 ON t1(a,b,a)
1a080 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1a090 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44  t1 WHERE a=0 AND
1a0a0 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73   b=0; */.    tes
1a0b0 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77  tcase( (pTerm->w
1a0c0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
1a0d0 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  DED)!=0 );.    t
1a0e0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1a0f0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1a100 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
1a110 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
1a120 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45  /.    r1 = codeE
1a130 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
1a140 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
1a150 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42  l, j, bRev, regB
1a160 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20  ase+j);.    if( 
1a170 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b  r1!=regBase+j ){
1a180 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d  .      if( nReg=
1a190 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1a1a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a1b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42  Reg(pParse, regB
1a1c0 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
1a1d0 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20  gBase = r1;.    
1a1e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a1f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a200 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1a210 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a  r1, regBase+j);.
1a220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a230 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1a240 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1a250 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
1a260 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1a270 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1a280 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IN );.    if( (p
1a290 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1a2a0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  & (WO_ISNULL|WO_
1a2b0 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  IN))==0 ){.     
1a2c0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
1a2d0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
1a2e0 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
1a2f0 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
1a300 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
1a310 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76   regBase+j, pLev
1a320 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
1a330 20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a      if( zAff ){.
1a340 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1a350 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1a360 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ty(pRight, zAff[
1a370 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  j])==SQLITE_AFF_
1a380 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
1a390 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
1a3a0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
1a3b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1a3c0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
1a3d0 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
1a3e0 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66  nge(pRight, zAff
1a3f0 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
1a400 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
1a410 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
1a420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a430 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66     }.  }.  *pzAf
1a440 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75  f = zAff;.  retu
1a450 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23  rn regBase;.}..#
1a460 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a470 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
1a480 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1a490 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78   a helper for ex
1a4a0 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1a4b0 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53  ) below.**.** pS
1a4c0 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78  tr holds the tex
1a4d0 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
1a4e0 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62  on that we are b
1a4f0 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74  uilding up one t
1a500 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65  erm.** at a time
1a510 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1a520 61 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20  adds a new term 
1a530 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1a540 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  e expression..**
1a550 20 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72   Terms are separ
1a560 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61  ated by AND so a
1a570 64 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78  dd the "AND" tex
1a580 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64  t for second and
1a590 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74   subsequent.** t
1a5a0 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  erms only..*/.st
1a5b0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
1a5c0 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53  nAppendTerm(.  S
1a5d0 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20  trAccum *pStr,  
1a5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a5f0 65 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f  e text expressio
1a600 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f  n being built */
1a610 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20  .  int iTerm,   
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a630 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20  * Index of this 
1a640 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20  term.  First is 
1a650 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  zero */.  const 
1a660 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20  char *zColumn,  
1a670 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1a680 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
1a690 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a6b0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72  Name of the oper
1a6c0 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ator */.){.  if(
1a6d0 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33   iTerm ) sqlite3
1a6e0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1a6f0 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29  Str, " AND ", 5)
1a700 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1a710 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
1a720 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20  zColumn, -1);.  
1a730 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1a740 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c  ppend(pStr, zOp,
1a750 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   1);.  sqlite3St
1a760 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1a770 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f  r, "?", 1);.}../
1a780 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c  *.** Argument pL
1a790 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20 61  evel describes a
1a7a0 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73 63   strategy for sc
1a7b0 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61  anning table pTa
1a7c0 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  b. This .** func
1a7d0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
1a7e0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
1a7f0 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ng buffer contai
1a800 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ning a descripti
1a810 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  on.** of the sub
1a820 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77  set of table row
1a830 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65  s scanned by the
1a840 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65   strategy in the
1a850 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53   form of an.** S
1a860 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f  QL expression. O
1a870 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61  r, if all rows a
1a880 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c  re scanned, NULL
1a890 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1a8a0 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
1a8b0 20 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a   if the query:.*
1a8c0 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
1a8d0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
1a8e0 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a  1 AND b>2;.**.**
1a8f0 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72   is run and ther
1a900 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
1a910 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68   (a, b), then th
1a920 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1a930 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20  rns a.** string 
1a940 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a  similar to:.**.*
1a950 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f  *   "a=? AND b>?
1a960 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ".**.** The retu
1a970 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  rned pointer poi
1a980 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  nts to memory ob
1a990 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1a9a0 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a  te3DbMalloc()..*
1a9b0 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
1a9c0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1a9d0 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65  e caller to free
1a9e0 20 74 68 65 20 62 75 66 66 65 72 20 77 68 65 6e   the buffer when
1a9f0 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e   it is.** no lon
1aa00 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f  ger required..*/
1aa10 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78  .static char *ex
1aa20 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1aa30 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
1aa40 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54  reLoop *pLoop, T
1aa50 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49  able *pTab){.  I
1aa60 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
1aa70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1aa80 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
1aa90 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1aaa0 2e 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .nEq;.  int i, j
1aab0 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
1aac0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20   = pTab->aCol;. 
1aad0 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d   int *aiColumn =
1aae0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1aaf0 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78  n;.  StrAccum tx
1ab00 74 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  t;..  if( pIndex
1ab10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1ab20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
1ab30 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1ab40 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
1ab50 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
1ab60 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  IT))==0 ){.    r
1ab70 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
1ab80 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
1ab90 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53  it(&txt, 0, 0, S
1aba0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
1abb0 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62  );.  txt.db = db
1abc0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1abd0 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
1abe0 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28  " (", 2);.  for(
1abf0 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29  i=0; i<nEq; i++)
1ac00 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  {.    explainApp
1ac10 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c  endTerm(&txt, i,
1ac20 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69   aCol[aiColumn[i
1ac30 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a  ]].zName, "=");.
1ac40 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20    }..  j = i;.  
1ac50 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1ac60 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
1ac70 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
1ac80 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e  z = (j==pIndex->
1ac90 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77  nColumn ) ? "row
1aca0 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
1acb0 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
1acc0 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
1acd0 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20  Term(&txt, i++, 
1ace0 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69  z, ">");.  }.  i
1acf0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1ad00 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  s&WHERE_TOP_LIMI
1ad10 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
1ad20 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e   = (j==pIndex->n
1ad30 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69  Column ) ? "rowi
1ad40 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
1ad50 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[j]].zName;.  
1ad60 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1ad70 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20  erm(&txt, i, z, 
1ad80 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  "<");.  }.  sqli
1ad90 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1ada0 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b  d(&txt, ")", 1);
1adb0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1adc0 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
1add0 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &txt);.}../*.** 
1ade0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1adf0 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1ae00 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
1ae10 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20  sing an EXPLAIN 
1ae20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f  QUERY PLAN.** co
1ae30 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75  mmand. If the qu
1ae40 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c  ery being compil
1ae50 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  ed is an EXPLAIN
1ae60 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73   QUERY PLAN, a s
1ae70 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20  ingle.** record 
1ae80 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1ae90 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
1aea0 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
1aeb0 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a  n strategy in .*
1aec0 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  * pLevel..*/.sta
1aed0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
1aee0 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65  OneScan(.  Parse
1aef0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1af00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1af10 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
1af20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1af30 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1af40 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74   /* Table list t
1af50 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20  his loop refers 
1af60 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  to */.  WhereLev
1af70 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20  el *pLevel,     
1af80 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
1af90 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c  to write OP_Expl
1afa0 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a  ain opcode for *
1afb0 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
1afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afd0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
1afe0 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20   "level" column 
1aff0 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  of output */.  i
1b000 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b020 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f  * Value for "fro
1b030 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  m" column of out
1b040 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  put */.  u16 wct
1b050 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
1b060 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1b070 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  s passed to sqli
1b080 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
1b090 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
1b0a0 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
1b0b0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1b0c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1b0d0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1b0e0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1b0f0 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
1b100 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
1b110 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
1b120 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
1b130 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1b140 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
1b150 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
1b160 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
1b170 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Msg;            
1b180 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
1b190 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74  o add to EQP out
1b1a0 70 75 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  put */.    sqlit
1b1b0 65 33 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20  e3_int64 nRow;  
1b1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
1b1d0 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  cted number of r
1b1e0 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 73  ows visited by s
1b1f0 63 61 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  can */.    int i
1b200 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
1b210 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65  lectId;  /* Sele
1b220 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74  ct id (left-most
1b230 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20   output column) 
1b240 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61  */.    int isSea
1b250 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  rch;            
1b260 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1b270 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65   a SEARCH. False
1b280 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20   for SCAN. */.  
1b290 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1b2a0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1b2b0 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69  /* The controlli
1b2c0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ng WhereLoop obj
1b2d0 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66  ect */.    u32 f
1b2e0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1b2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1b300 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
1b310 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  this loop */..  
1b320 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
1b330 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c  ->pWLoop;.    fl
1b340 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46  ags = pLoop->wsF
1b350 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66  lags;.    if( (f
1b360 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
1b370 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c  _OR) || (wctrlFl
1b380 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
1b390 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72  LE_ONLY) ) retur
1b3a0 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68  n;..    isSearch
1b3b0 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52 45   = (flags&(WHERE
1b3c0 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1b3d0 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a  _TOP_LIMIT))!=0.
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
1b3f0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52  (flags&WHERE_VIR
1b400 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26  TUALTABLE)==0 &&
1b410 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65   (pLoop->u.btree
1b420 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20  .nEq>0)).       
1b430 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
1b440 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52  ags&(WHERE_ORDER
1b450 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44  BY_MIN|WHERE_ORD
1b460 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20  ERBY_MAX));..   
1b470 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1b480 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
1b490 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52 43   isSearch?"SEARC
1b4a0 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20  H":"SCAN");.    
1b4b0 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
1b4c0 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  ct ){.      zMsg
1b4d0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1b4e0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1b4f0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a   SUBQUERY %d", z
1b500 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65  Msg,pItem->iSele
1b510 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ctId);.    }else
1b520 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
1b530 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1b540 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42  b, zMsg, "%s TAB
1b550 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  LE %s", zMsg, pI
1b560 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1b570 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65   }..    if( pIte
1b580 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
1b590 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1b5a0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1b5b0 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20  sg, "%s AS %s", 
1b5c0 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
1b5d0 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ias);.    }.    
1b5e0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57 48  if( (flags & (WH
1b5f0 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49  ERE_IPK|WHERE_VI
1b600 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a  RTUALTABLE))==0.
1b610 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75       && pLoop->u
1b620 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
1b630 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68  .    ){.      ch
1b640 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70  ar *zWhere = exp
1b650 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64  lainIndexRange(d
1b660 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d  b, pLoop, pItem-
1b670 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d  >pTab);.      zM
1b680 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1b690 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1b6a0 25 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44  %s USING %s%sIND
1b6b0 45 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c  EX%s%s%s", zMsg,
1b6c0 20 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c   .          ((fl
1b6d0 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
1b6e0 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54  _INDEX)?"AUTOMAT
1b6f0 49 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20  IC ":""),.      
1b700 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
1b710 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43  ERE_IDX_ONLY)?"C
1b720 4f 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20  OVERING ":""),. 
1b730 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
1b740 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
1b750 44 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20  DEX)?"":" "),.  
1b760 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
1b770 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
1b780 45 58 29 3f 22 22 3a 20 70 4c 6f 6f 70 2d 3e 75  EX)?"": pLoop->u
1b790 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
1b7a0 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
1b7b0 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b   zWhere.      );
1b7c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1b7d0 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29  Free(db, zWhere)
1b7e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1b7f0 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  (flags & WHERE_I
1b800 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73  PK)!=0 && (flags
1b810 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
1b820 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  INT)!=0 ){.     
1b830 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1b840 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1b850 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45  , "%s USING INTE
1b860 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
1b870 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20  , zMsg);..      
1b880 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
1b890 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20  COLUMN_EQ ){.   
1b8a0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1b8b0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1b8c0 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1b8d0 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  =?)", zMsg);.   
1b8e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1b8f0 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ags&WHERE_BOTH_L
1b900 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54  IMIT)==WHERE_BOT
1b910 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  H_LIMIT ){.     
1b920 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1b930 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1b940 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
1b950 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20   AND rowid<?)", 
1b960 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
1b970 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45  se if( flags&WHE
1b980 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
1b990 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1b9a0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1b9b0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
1b9c0 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid>?)", zMsg);.
1b9d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b9e0 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f  flags&WHERE_TOP_
1b9f0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
1ba00 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1ba10 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1ba20 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22  , "%s (rowid<?)"
1ba30 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
1ba40 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1ba50 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1ba60 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65  ALTABLE.    else
1ba70 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
1ba80 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1ba90 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d  )!=0 ){.      zM
1baa0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1bab0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1bac0 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  %s VIRTUAL TABLE
1bad0 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a   INDEX %d:%s", z
1bae0 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
1baf0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
1bb00 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f  vtab.idxNum, pLo
1bb10 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  op->u.vtab.idxSt
1bb20 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  r);.    }.#endif
1bb30 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c  .    if( wctrlFl
1bb40 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52  ags&(WHERE_ORDER
1bb50 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44  BY_MIN|WHERE_ORD
1bb60 45 52 42 59 5f 4d 41 58 29 20 29 7b 0a 20 20 20  ERBY_MAX) ){.   
1bb70 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
1bb80 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1bb90 4f 52 44 45 52 42 59 5f 4d 49 4e 20 29 3b 0a 20  ORDERBY_MIN );. 
1bba0 20 20 20 20 20 6e 52 6f 77 20 3d 20 31 3b 0a 20       nRow = 1;. 
1bbb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bbc0 6e 52 6f 77 20 3d 20 28 73 71 6c 69 74 65 33 5f  nRow = (sqlite3_
1bbd0 69 6e 74 36 34 29 70 4c 6f 6f 70 2d 3e 6e 4f 75  int64)pLoop->nOu
1bbe0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 73  t;.    }.    zMs
1bbf0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1bc00 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1bc10 73 20 28 7e 25 6c 6c 64 20 72 6f 77 73 29 22 2c  s (~%lld rows)",
1bc20 20 7a 4d 73 67 2c 20 6e 52 6f 77 29 3b 0a 20 20   zMsg, nRow);.  
1bc30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bc40 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
1bc50 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20  n, iId, iLevel, 
1bc60 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f  iFrom, zMsg, P4_
1bc70 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
1bc80 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
1bc90 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c  xplainOneScan(u,
1bca0 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
1bcb0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1bcc0 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a  _EXPLAIN */.../*
1bcd0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1bce0 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
1bcf0 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68  of the iLevel-th
1bd00 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45   loop in the WHE
1bd10 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70  RE clause.** imp
1bd20 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63  lementation desc
1bd30 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e  ribed by pWInfo.
1bd40 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
1bd50 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  sk codeOneLoopSt
1bd60 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  art(.  WhereInfo
1bd70 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
1bd80 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
1bd90 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
1bda0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1bdb0 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
1bdc0 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
1bdd0 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
1bde0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
1bdf0 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
1be00 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
1be10 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
1be20 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
1be30 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
1be40 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
1be50 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1be60 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
1be70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1be80 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1be90 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
1bea0 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
1beb0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1bec0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
1bed0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1bee0 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
1bef0 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
1bf00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1bf10 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
1bf20 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
1bf30 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
1bf40 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
1bf50 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
1bf60 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
1bf70 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1bf80 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
1bf90 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
1bfa0 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
1bfb0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f  oop *pLoop;    /
1bfc0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
1bfd0 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64  object being cod
1bfe0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
1bff0 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20  use *pWC;    /* 
1c000 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
1c010 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52   the entire WHER
1c020 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
1c030 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c050 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   A WHERE clause 
1c060 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20  term */.  Parse 
1c070 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1c080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1c090 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1c0a0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0c0 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
1c0d0 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e  d stmt under con
1c0e0 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
1c0f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1c100 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
1c110 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
1c120 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20  erm being coded 
1c130 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b  */.  int addrBrk
1c140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c150 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1c160 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
1c170 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
1c180 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20  int addrCont;   
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1a0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1c1b0 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
1c1c0 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
1c1d0 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b  t iRowidReg = 0;
1c1e0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
1c1f0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
1c200 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20  is register, if 
1c210 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e  not zero */.  in
1c220 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  t iReleaseReg = 
1c230 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  0;      /* Temp 
1c240 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
1c250 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1c260 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  g */.  Bitmask n
1c270 65 77 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  ewNotReady;     
1c280 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1c290 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
1c2a0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1c2b0 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
1c2c0 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  dbe;.  pWC = &pW
1c2d0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 65  Info->sWC;.  pLe
1c2e0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
1c2f0 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f  [iLevel];.  pLoo
1c300 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
1c310 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  op;.  pTabItem =
1c320 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
1c330 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
1c340 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70  rom];.  iCur = p
1c350 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
1c360 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e  ;.  bRev = (pWIn
1c370 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65  fo->revMask>>iLe
1c380 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61  vel)&1;.  omitTa
1c390 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73  ble = (pLoop->ws
1c3a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
1c3b0 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20  X_ONLY)!=0 .    
1c3c0 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
1c3d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1c3e0 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
1c3f0 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f  E)==0;.  VdbeNoo
1c400 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
1c410 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64  gin Join Loop %d
1c420 22 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20  ", iLevel));..  
1c430 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
1c440 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
1c450 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
1c460 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a  instructions.  *
1c470 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
1c480 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
1c490 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61   addrBrk to brea
1c4a0 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  k out of a loop.
1c4b0 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f  .  ** Jump to co
1c4c0 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
1c4d0 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
1c4e0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
1c4f0 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a  e.  ** loop..  *
1c500 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72  *.  ** When ther
1c510 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
1c520 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76  tor, we also hav
1c530 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61  e a "addrNxt" la
1c540 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65  bel that.  ** me
1c550 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
1c560 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
1c570 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
1c580 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74  on.  When.  ** t
1c590 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f  here are no IN o
1c5a0 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
1c5b0 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1c5c0 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
1c5d0 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  .  ** is the sam
1c5e0 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a  e as "addrBrk"..
1c5f0 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d    */.  addrBrk =
1c600 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1c610 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1c620 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1c630 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1c640 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65  addrCont = pLeve
1c650 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  l->addrCont = sq
1c660 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1c670 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  el(v);..  /* If 
1c680 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
1c690 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
1c6a0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
1c6b0 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20  locate and.  ** 
1c6c0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
1c6d0 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
1c6e0 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
1c6f0 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
1c700 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
1c710 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
1c720 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  e join..  */.  i
1c730 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
1c740 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
1c750 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  0].jointype & JT
1c760 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
1c770 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1c780 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  in = ++pParse->n
1c790 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1c7a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c7b0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65  _Integer, 0, pLe
1c7c0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
1c7d0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1c7e0 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
1c7f0 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
1c800 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ag"));.  }..  /*
1c810 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   Special case of
1c820 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73   a FROM clause s
1c830 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e  ubquery implemen
1c840 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
1c850 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ine */.  if( pTa
1c860 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  bItem->viaCorout
1c870 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
1c880 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
1c890 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
1c8a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c8b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1c8c0 65 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64  er, pTabItem->ad
1c8d0 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67  drFillSub-1, reg
1c8e0 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76  Yield);.    pLev
1c8f0 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65  el->p2 =  sqlite
1c900 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
1c910 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
1c920 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  d);.    VdbeComm
1c930 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f  ent((v, "next ro
1c940 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20  w of co-routine 
1c950 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  %s", pTabItem->p
1c960 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
1c970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c980 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
1c990 67 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72  gYield+1, addrBr
1c9a0 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
1c9b0 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20  op = OP_Goto;.  
1c9c0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
1c9d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1c9e0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28  ALTABLE.  if(  (
1c9f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1ca00 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1ca10 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f  BLE)!=0 ){.    /
1ca20 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74  * Case 1:  The t
1ca30 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61  able is a virtua
1ca40 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68  l-table.  Use th
1ca50 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e  e VFilter and VN
1ca60 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ext.    **      
1ca70 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68      to access th
1ca80 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  e data..    */. 
1ca90 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f     int iReg;   /
1caa0 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f  * P3 Value for O
1cab0 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20  P_VFilter */.   
1cac0 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e   int addrNotFoun
1cad0 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  d;.    int nCons
1cae0 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e  traint = pLoop->
1caf0 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c  nLTerm;..    sql
1cb00 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1cb10 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  h(pParse);.    i
1cb20 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1cb30 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1cb40 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
1cb50 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75  ;.    addrNotFou
1cb60 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nd = pLevel->add
1cb70 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  rBrk;.    for(j=
1cb80 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; j<nConstraint
1cb90 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; j++){.      in
1cba0 74 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67  t iTarget = iReg
1cbb0 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72  +j+2;.      pTer
1cbc0 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
1cbd0 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
1cbe0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1cbf0 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
1cc00 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79      codeEquality
1cc10 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1cc20 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
1cc30 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  Rev, iTarget);. 
1cc40 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f         addrNotFo
1cc50 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
1cc60 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  drNxt;.      }el
1cc70 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1cc80 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1cc90 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
1cca0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
1ccb0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1ccc0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1ccd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1cce0 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  teger, pLoop->u.
1ccf0 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65  vtab.idxNum, iRe
1cd00 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
1cd10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cd20 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72  Integer, nConstr
1cd30 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20  aint, iReg+1);. 
1cd40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cd50 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
1cd60 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f  er, iCur, addrNo
1cd70 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20  tFound, iReg,.  
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1cda0 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20  b.idxStr,.      
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65  pLoop->u.vtab.ne
1cdd0 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49  edFree ? P4_MPRI
1cde0 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29  NTF : P4_STATIC)
1cdf0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76  ;.    pLoop->u.v
1ce00 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1ce10 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1ce20 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20  <nConstraint && 
1ce30 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  j<16; j++){.    
1ce40 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e    if( (pLoop->u.
1ce50 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a  vtab.omitMask>>j
1ce60 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64  )&1 ){.        d
1ce70 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1ce80 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  l, pLoop->aLTerm
1ce90 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [j]);.      }.  
1cea0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1ceb0 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
1cec0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1ced0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1cee0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1cef0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1cf00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1cf10 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1cf20 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
1cf30 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
1cf40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1cf50 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
1cf60 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
1cf70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1cf80 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
1cf90 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1cfa0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
1cfb0 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f  )!=0.   && (pLoo
1cfc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
1cfd0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
1cfe0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21  ERE_COLUMN_EQ))!
1cff0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43  =0.  ){.    /* C
1d000 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64  ase 2:  We can d
1d010 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
1d020 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
1d030 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
1d040 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
1d050 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
1d060 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
1d070 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
1d080 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
1d090 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
1d0a0 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
1d0b0 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
1d0c0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
1d0d0 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
1d0e0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
1d0f0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31  ->u.btree.nEq==1
1d100 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65   );.    iRelease
1d110 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1d120 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1d130 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
1d140 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
1d150 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1d160 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1d170 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
1d180 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1d190 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
1d1a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d1b0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1d1c0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1d1d0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
1d1e0 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f  11662 */.    iRo
1d1f0 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75  widReg = codeEqu
1d200 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
1d210 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
1d220 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61   0, bRev, iRelea
1d230 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72  seReg);.    addr
1d240 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
1d250 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  drNxt;.    sqlit
1d260 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d270 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52  OP_MustBeInt, iR
1d280 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74  owidReg, addrNxt
1d290 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d2a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
1d2b0 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20  otExists, iCur, 
1d2c0 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52  addrNxt, iRowidR
1d2d0 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
1d2e0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1d2f0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1d300 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20  iRowidReg, 1);. 
1d310 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1d320 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1d330 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1d340 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43  dReg);.    VdbeC
1d350 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1d360 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1d370 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d  p = OP_Noop;.  }
1d380 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d  else if( (pLoop-
1d390 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1d3a0 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20  _IPK)!=0.       
1d3b0 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
1d3c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1d3d0 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20  UMN_RANGE)!=0.  
1d3e0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33  ){.    /* Case 3
1d3f0 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
1d400 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
1d410 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
1d420 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
1d430 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
1d440 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
1d450 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
1d460 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
1d470 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
1d480 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
1d490 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
1d4a0 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
1d4b0 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
1d4c0 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20  pStart = pEnd = 
1d4d0 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  0;.    if( pLoop
1d4e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1d4f0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53  E_BTM_LIMIT ) pS
1d500 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
1d510 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69  Term[j++];.    i
1d520 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1d530 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
1d540 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f  MIT ) pEnd = pLo
1d550 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1d560 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b  .    if( bRev ){
1d570 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70  .      pTerm = p
1d580 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74  Start;.      pSt
1d590 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  art = pEnd;.    
1d5a0 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a    pEnd = pTerm;.
1d5b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
1d5c0 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78  tart ){.      Ex
1d5d0 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
1d5e0 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
1d5f0 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e  ssion that defin
1d600 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75  es the start bou
1d610 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
1d620 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20  r1, rTemp;      
1d630 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66    /* Registers f
1d640 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  or holding the s
1d650 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f  tart boundary */
1d660 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ..      /* The f
1d670 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e  ollowing constan
1d680 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64  t maps TK_xx cod
1d690 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f  es into correspo
1d6a0 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  nding .      ** 
1d6b0 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49  seek opcodes.  I
1d6c0 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70  t depends on a p
1d6d0 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69  articular orderi
1d6e0 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20  ng of TK_xx.    
1d6f0 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74    */.      const
1d700 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20   u8 aMoveOp[] = 
1d710 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {.           /* 
1d720 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GT */  OP_See
1d730 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kGt,.           
1d740 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f  /* TK_LE */  OP_
1d750 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20  SeekLe,.        
1d760 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20     /* TK_LT */  
1d770 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20  OP_SeekLt,.     
1d780 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a        /* TK_GE *
1d790 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20  /  OP_SeekGe.   
1d7a0 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65     };.      asse
1d7b0 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54  rt( TK_LE==TK_GT
1d7c0 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61  +1 );      /* Ma
1d7d0 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65  ke sure the orde
1d7e0 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ring.. */.      
1d7f0 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54  assert( TK_LT==T
1d800 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f  K_GT+2 );      /
1d810 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b  *  ... of the TK
1d820 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f  _xx values... */
1d830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1d840 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b  K_GE==TK_GT+3 );
1d850 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73        /*  ... is
1d860 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20   correcct. */.. 
1d870 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1d880 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1d890 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1d8a0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
1d8b0 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 70  11662 */.      p
1d8c0 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70  X = pStart->pExp
1d8d0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1d8e0 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
1d8f0 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e  assert( pStart->
1d900 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
1d910 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1d920 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1d930 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  mp(pParse, pX->p
1d940 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a  Right, &rTemp);.
1d950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d960 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65  eAddOp3(v, aMove
1d970 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d  Op[pX->op-TK_GT]
1d980 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c  , iCur, addrBrk,
1d990 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
1d9a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
1d9b0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
1d9c0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1d9d0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1d9e0 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73   r1, 1);.      s
1d9f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1da00 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65  pReg(pParse, rTe
1da10 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62  mp);.      disab
1da20 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1da30 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73  Start);.    }els
1da40 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1da50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
1da60 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
1da70 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
1da80 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a  addrBrk);.    }.
1da90 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
1daa0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
1dab0 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
1dac0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1dad0 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1dae0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
1daf0 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  d->leftCursor==i
1db00 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Cur );.      tes
1db10 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46  tcase( pEnd->wtF
1db20 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1db30 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
1db40 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
1db50 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
1db60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1db70 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1db80 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1db90 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
1dba0 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
1dbb0 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
1dbc0 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
1dbd0 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
1dbe0 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1dbf0 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
1dc00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dc10 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1dc20 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
1dc30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dc40 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1dc50 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
1dc60 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
1dc70 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1dc80 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
1dc90 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
1dca0 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
1dcb0 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1dcc0 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
1dcd0 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
1dce0 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
1dcf0 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20 29  ==0 && pEnd==0 )
1dd00 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1dd10 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
1dd20 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
1dd30 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  STEP;.    }else{
1dd40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1dd50 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
1dd60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65      }.    if( te
1dd70 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
1dd80 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1dd90 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
1dda0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1ddb0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1ddc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ddd0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1dde0 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
1ddf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1de00 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1de10 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1de20 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1de30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1de40 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
1de50 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
1de60 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
1de70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1de80 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
1de90 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1dea0 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
1deb0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
1dec0 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
1ded0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1dee0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
1def0 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61  /* Case 4: A sca
1df00 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
1df10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1df20 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
1df30 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
1df40 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
1df50 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
1df60 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
1df70 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
1df80 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
1df90 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
1dfa0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
1dfb0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
1dfc0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
1dfd0 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1dfe0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1dff0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1e000 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
1e010 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
1e020 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
1e030 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
1e040 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
1e050 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
1e060 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
1e070 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
1e080 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
1e090 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
1e0a0 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
1e0b0 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
1e0c0 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
1e0d0 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
1e0e0 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
1e0f0 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1e100 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
1e110 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
1e120 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
1e130 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
1e140 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
1e150 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
1e160 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1e170 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
1e180 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1e190 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
1e1a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1e1b0 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1e1d0 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
1e1e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1e1f0 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
1e200 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
1e210 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1e220 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
1e230 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
1e240 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
1e250 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
1e260 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
1e270 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1e280 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1e290 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
1e2a0 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
1e2b0 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
1e2c0 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
1e2d0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
1e2e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
1e2f0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
1e300 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1e310 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
1e320 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
1e330 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
1e340 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1e350 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
1e360 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
1e370 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
1e380 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
1e390 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
1e3a0 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
1e3b0 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
1e3c0 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
1e3d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
1e3e0 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
1e3f0 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
1e400 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
1e410 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73  ..    */  .    s
1e420 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1e430 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20  StartOp[] = {.  
1e440 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a      0,.      0,.
1e450 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c        OP_Rewind,
1e460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
1e470 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1e480 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1e490 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20  &&  !bRev) */.  
1e4a0 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20      OP_Last,    
1e4b0 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
1e4c0 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
1e4d0 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
1e4e0 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20     bRev) */.    
1e4f0 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20    OP_SeekGt,    
1e500 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74         /* 4: (st
1e510 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1e520 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1e530 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1e540 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20  OP_SeekLt,      
1e550 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
1e560 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1e570 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
1e580 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1e590 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20  _SeekGe,        
1e5a0 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f     /* 6: (start_
1e5b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1e5c0 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65   startEq && !bRe
1e5d0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1e5e0 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20  eekLe           
1e5f0 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f   /* 7: (start_co
1e600 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
1e610 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1e620 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73   */.    };.    s
1e630 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1e640 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
1e650 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20    OP_Noop,      
1e660 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65         /* 0: (!e
1e670 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20  nd_constraints) 
1e680 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
1e690 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1e6a0 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
1e6b0 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a  ints && !bRev) *
1e6c0 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54  /.      OP_IdxLT
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e6e0 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
1e6f0 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a  nts && bRev) */.
1e700 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
1e710 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
1e720 72 65 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d  ree.nEq;  /* Num
1e730 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
1e740 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
1e750 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b   isMinQuery = 0;
1e760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1e770 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
1e780 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
1e790 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  n(x).. */.    in
1e7a0 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
1e7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
1e7c0 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
1e7d0 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
1e7e0 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  alues */.    int
1e7f0 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
1e800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
1e810 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  p register */.  
1e820 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
1e830 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
1e840 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
1e850 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
1e860 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
1e870 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
1e880 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
1e890 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1e8a0 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
1e8b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
1e8c0 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
1e8d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e8e0 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
1e8f0 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1e900 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e920 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1e930 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
1e940 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
1e950 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
1e960 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
1e970 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
1e980 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
1e990 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
1e9a0 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1e9b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1e9c0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1e9d0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1e9e0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1e9f0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1ea00 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
1ea10 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
1ea20 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
1ea30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1ea40 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1ea50 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1ea60 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
1ea70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ea80 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
1ea90 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
1eaa0 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eac0 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
1ead0 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
1eae0 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb00 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
1eb10 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
1eb20 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
1eb30 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20  ar *zEndAff;    
1eb40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
1eb50 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
1eb60 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
1eb70 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  nt */..    pIdx 
1eb80 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1eb90 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64  .pIndex;.    iId
1eba0 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
1ebb0 49 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20  IdxCur;.    k = 
1ebc0 28 6e 45 71 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  (nEq==pIdx->nCol
1ebd0 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 49 64 78 2d  umn ? -1 : pIdx-
1ebe0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3b  >aiColumn[nEq]);
1ebf0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1ec00 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
1ec10 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
1ec20 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
1ec30 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
1ec40 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1ec50 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
1ec60 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
1ec70 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
1ec80 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
1ec90 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1eca0 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
1ecb0 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
1ecc0 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
1ecd0 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
1ece0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
1ecf0 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
1ed00 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
1ed10 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
1ed20 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
1ed30 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
1ed40 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
1ed50 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
1ed60 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
1ed70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
1ed80 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
1ed90 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
1eda0 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
1edb0 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
1edc0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
1edd0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1ede0 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
1edf0 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
1ee00 3e 6e 4f 42 53 61 74 3e 30 29 0a 20 20 20 20 20  >nOBSat>0).     
1ee10 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
1ee20 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  n>nEq).    ){.  
1ee30 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
1ee40 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
1ee50 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  1 ); */.      /*
1ee60 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1ee70 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  y->a[0].pExpr->i
1ee80 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
1ee90 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a  Column[nEq] ); *
1eea0 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  /.      isMinQue
1eeb0 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
1eec0 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1eed0 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
1eee0 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
1eef0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1ef00 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
1ef10 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
1ef20 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
1ef30 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b   */.    j = nEq;
1ef40 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1ef50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ef60 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1ef70 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d     pRangeStart =
1ef80 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1ef90 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  ++];.      nExtr
1efa0 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1efb0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1efc0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
1efd0 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1efe0 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c    pRangeEnd = pL
1eff0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1f000 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1f010 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1f020 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1f030 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
1f040 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
1f050 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
1f060 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74  IN.    ** and st
1f070 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ore the values o
1f080 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e  f those terms in
1f090 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
1f0a0 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1f0b0 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73  arting at regBas
1f0c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  e..    */.    re
1f0d0 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
1f0e0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
1f0f0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c        pParse, pL
1f100 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65  evel, pWC, notRe
1f110 61 64 79 2c 20 62 52 65 76 2c 20 6e 45 78 74 72  ady, bRev, nExtr
1f120 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66 66  aReg, &zStartAff
1f130 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64  .    );.    zEnd
1f140 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
1f150 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
1f160 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
1f170 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
1f180 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20  el->addrNxt;..  
1f190 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1f1a0 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f  oing a reverse o
1f1b0 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20  rder scan on an 
1f1c0 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  ascending index,
1f1d0 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72   or.    ** a for
1f1e0 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20  ward order scan 
1f1f0 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
1f200 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e  index, interchan
1f210 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  ge the .    ** s
1f220 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72  tart and end ter
1f230 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20  ms (pRangeStart 
1f240 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a  and pRangeEnd)..
1f250 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1f260 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  nEq<pIdx->nColum
1f270 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78  n && bRev==(pIdx
1f280 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
1f290 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
1f2a0 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76  )).     || (bRev
1f2b0 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   && pIdx->nColum
1f2c0 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  n==nEq).    ){. 
1f2d0 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54       SWAP(WhereT
1f2e0 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64  erm *, pRangeEnd
1f2f0 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
1f300 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
1f310 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
1f320 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
1f330 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1f340 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LE );.    testca
1f350 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
1f360 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  && pRangeStart->
1f370 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
1f380 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
1f390 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
1f3a0 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
1f3b0 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
1f3c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
1f3d0 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67  angeEnd && pRang
1f3e0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1f3f0 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73  & WO_GE );.    s
1f400 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
1f410 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
1f420 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
1f430 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
1f440 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21  .    endEq =   !
1f450 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61  pRangeEnd || pRa
1f460 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
1f470 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
1f480 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  );.    start_con
1f490 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67  straints = pRang
1f4a0 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b  eStart || nEq>0;
1f4b0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
1f4c0 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
1f4d0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1f4e0 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
1f4f0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
1f500 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
1f510 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  geStart ){.     
1f520 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
1f530 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78  pRangeStart->pEx
1f540 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1f550 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1f560 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
1f570 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
1f580 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
1f590 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
1f5a0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1f5b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f5c0 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
1f5d0 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
1f5e0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
1f5f0 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  drNxt);.      }.
1f600 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
1f610 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
1f620 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1f630 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1f640 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
1f650 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
1f660 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
1f670 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
1f680 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
1f690 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
1f6a0 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
1f6b0 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
1f6c0 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
1f6d0 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
1f6e0 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
1f6f0 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
1f700 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
1f710 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
1f720 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
1f730 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
1f740 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
1f750 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1f760 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
1f770 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
1f780 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
1f790 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
1f7a0 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
1f7b0 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
1f7c0 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
1f7d0 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
1f7e0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1f7f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f800 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
1f810 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1f820 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
1f830 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
1f840 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
1f850 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20  MinQuery ){.    
1f860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f870 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1f880 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  0, regBase+nEq);
1f890 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
1f8a0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72  nt++;.      star
1f8b0 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  tEq = 0;.      s
1f8c0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1f8d0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1f8e0 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
1f8f0 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
1f900 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20  e, nConstraint, 
1f910 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
1f920 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73  op = aStartOp[(s
1f930 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1f940 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c  <<2) + (startEq<
1f950 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20  <1) + bRev];.   
1f960 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29   assert( op!=0 )
1f970 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1f980 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b  op==OP_Rewind );
1f990 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
1f9a0 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20  p==OP_Last );.  
1f9b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f9c0 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20  OP_SeekGt );.   
1f9d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1f9e0 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20  P_SeekGe );.    
1f9f0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1fa00 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74  _SeekLe );.    t
1fa10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1fa20 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71  SeekLt );.    sq
1fa30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1fa40 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
1fa50 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
1fa60 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
1fa70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  );..    /* Load 
1fa80 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
1fa90 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
1faa0 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65  straint at the e
1fab0 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
1fac0 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e   range (if any).
1fad0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  .    */.    nCon
1fae0 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
1faf0 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64     if( pRangeEnd
1fb00 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1fb10 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45  pRight = pRangeE
1fb20 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  nd->pExpr->pRigh
1fb30 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1fb40 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1fb50 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
1fb60 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  nEq, 1);.      s
1fb70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1fb80 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
1fb90 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
1fba0 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e     if( (pRangeEn
1fbb0 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1fbc0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
1fbd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1fbe0 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
1fbf0 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
1fc00 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
1fc10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1fc20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a   if( zEndAff ){.
1fc30 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1fc40 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1fc50 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ty(pRight, zEndA
1fc60 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
1fc70 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
1fc80 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
1fc90 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
1fca0 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
1fcb0 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
1fcc0 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
1fcd0 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
1fce0 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
1fcf0 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
1fd00 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
1fd10 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
1fd20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
1fd30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
1fd40 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  EndAff[nEq] = SQ
1fd50 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1fd60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fd70 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1fd80 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
1fd90 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45  hange(pRight, zE
1fda0 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  ndAff[nEq]) ){. 
1fdb0 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66           zEndAff
1fdc0 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
1fdd0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
1fde0 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
1fdf0 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
1fe00 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
1fe10 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e  Base, nEq+1, zEn
1fe20 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f  dAff);.      nCo
1fe30 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1fe40 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1fe50 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
1fe60 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1fe70 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
1fe80 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  11662 */.    }. 
1fe90 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1fea0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74  (pParse->db, zSt
1feb0 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c  artAff);.    sql
1fec0 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1fed0 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b  e->db, zEndAff);
1fee0 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  ..    /* Top of 
1fef0 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f  the loop body */
1ff00 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1ff10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1ff20 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
1ff30 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
1ff40 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
1ff50 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
1ff60 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
1ff70 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b      op = aEndOp[
1ff80 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45  (pRangeEnd || nE
1ff90 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d  q) * (1 + bRev)]
1ffa0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1ffb0 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20  op==OP_Noop );. 
1ffc0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ffd0 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
1ffe0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1fff0 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69  P_IdxLT );.    i
20000 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  f( op!=OP_Noop )
20010 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
20020 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
20030 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
20040 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
20050 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
20060 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
20070 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21  angeP5(v, endEq!
20080 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20  =bRev ?1:0);.   
20090 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
200a0 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
200b0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
200c0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
200d0 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  alue.    ** of t
200e0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
200f0 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c  that the inequal
20100 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73  ity contrains is
20110 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
20120 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70  * If it is, jump
20130 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
20140 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
20150 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
20160 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
20170 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
20180 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
20190 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
201a0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
201b0 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  MIT );.    testc
201c0 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ase( pLevel->pla
201d0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
201e0 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_TOP_LIMIT );. 
201f0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
20200 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
20210 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
20220 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29  TOP_LIMIT))!=0 )
20230 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
20240 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
20250 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
20260 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20   nEq, r1);.     
20270 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20280 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
20290 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a   r1, addrCont);.
202a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
202b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
202c0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20  pParse, r1);..  
202d0 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61    /* Seek the ta
202e0 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72  ble cursor, if r
202f0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64  equired */.    d
20300 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
20310 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  l, pRangeStart);
20320 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
20330 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45  (pLevel, pRangeE
20340 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d  nd);.    if( !om
20350 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
20360 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65   iRowidReg = iRe
20370 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74  leaseReg = sqlit
20380 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
20390 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
203a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
203b0 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49   OP_IdxRowid, iI
203c0 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67  dxCur, iRowidReg
203d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
203e0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
203f0 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
20400 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
20410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20420 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c  dOp2(v, OP_Seek,
20430 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
20440 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20  );  /* Deferred 
20450 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  seek */.    }.. 
20460 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65     /* Record the
20470 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65   instruction use
20480 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
20490 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65  he loop. Disable
204a0 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63   .    ** WHERE c
204b0 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65  lause terms made
204c0 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68   redundant by th
204d0 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63  e index range sc
204e0 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  an..    */.    i
204f0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
20500 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
20510 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
20520 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
20530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52      }else if( bR
20540 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  ev ){.      pLev
20550 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76  el->op = OP_Prev
20560 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20570 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
20580 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  OP_Next;.    }. 
20590 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
205a0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 69 66 28  iIdxCur;.    if(
205b0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
205c0 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
205d0 5f 45 51 20 7c 20 57 48 45 52 45 5f 43 4f 4c 55  _EQ | WHERE_COLU
205e0 4d 4e 5f 52 41 4e 47 45 20 7c 20 0a 20 20 20 20  MN_RANGE | .    
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 20 20 20 20 20 57 48 45 52 45 5f 43 4f 4c 55        WHERE_COLU
20610 4d 4e 5f 4e 55 4c 4c 20 7c 20 57 48 45 52 45 5f  MN_NULL | WHERE_
20620 43 4f 4c 55 4d 4e 5f 49 4e 29 29 3d 3d 30 20 29  COLUMN_IN))==0 )
20630 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
20640 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
20650 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
20660 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  STEP;.    }else{
20670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20680 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
20690 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
206a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
206b0 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
206c0 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  ON.  if( pLoop->
206d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
206e0 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
206f0 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20  /* Case 5:  Two 
20700 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
20710 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ly indexed terms
20720 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
20730 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
20740 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
20750 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
20760 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29  ABLE t1(a,b,c,d)
20770 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
20780 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
20790 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (a);.    **   CR
207a0 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
207b0 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(b);.    **  
207c0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33   CREATE INDEX i3
207d0 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a   ON t1(c);.    *
207e0 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
207f0 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
20800 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20  E a=5 OR b=7 OR 
20810 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a  (c=11 AND d=13).
20820 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
20830 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68   the example, th
20840 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e  ere are three in
20850 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
20860 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20  ected by OR..   
20870 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74   ** The top of t
20880 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69  he loop looks li
20890 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a  ke this:.    **.
208a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
208b0 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
208c0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
208d0 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
208e0 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20   reg 1.    **.  
208f0 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65    ** Then, for e
20900 61 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ach indexed term
20910 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e  , the following.
20920 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
20930 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54  o.    ** RowSetT
20940 65 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61  est are such tha
20950 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  t the rowid of t
20960 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
20970 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a  s inserted.    *
20980 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65  * into the RowSe
20990 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  t. If it is alre
209a0 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e  ady present, con
209b0 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20  trol skips the. 
209c0 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f     ** Gosub opco
209d0 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72  de and jumps str
209e0 61 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64  aight to the cod
209f0 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57  e generated by W
20a00 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a  hereEnd()..    *
20a10 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
20a20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
20a30 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a  n(<term>).    **
20a40 20 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74            RowSet
20a50 54 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20  Test            
20a60 20 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72        # Insert r
20a70 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74  owid into rowset
20a80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
20a90 20 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a   Gosub      2 A.
20aa0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
20ab0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
20ac0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
20ad0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76  llowing the abov
20ae0 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69  e, code to termi
20af0 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c  nate the loop. L
20b00 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67  abel A, the targ
20b10 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  et.    ** of the
20b20 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75   Gosub above, ju
20b30 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72  mps to the instr
20b40 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74  uction right aft
20b50 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20  er the Goto..   
20b60 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
20b70 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b90 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
20ba0 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
20bb0 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20  *          Goto 
20bc0 20 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20        B         
20bd0 20 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f         # The loo
20be0 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20  p is finished.. 
20bf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
20c00 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79     A: <loop body
20c10 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
20c20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c    # Return data,
20c30 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a   whatever..    *
20c40 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
20c50 20 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20    Return     2  
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
20c70 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  Jump back to the
20c80 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20   Gosub.    **.  
20c90 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61    **       B: <a
20ca0 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20  fter the loop>. 
20cb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20     **.    */.   
20cc0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
20cd0 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rWc;    /* The O
20ce0 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20  R-clause broken 
20cf0 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  out into subterm
20d00 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  s */.    SrcList
20d10 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20   *pOrTab;       
20d20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62  /* Shortened tab
20d30 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c  le list or OR-cl
20d40 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  ause generation 
20d50 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43  */.    Index *pC
20d60 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ov = 0;         
20d70 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c      /* Potential
20d80 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
20d90 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20  (or NULL) */.   
20da0 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70   int iCovCur = p
20db0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
20dc0 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66  /* Cursor used f
20dd0 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28  or index scans (
20de0 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20  if any) */..    
20df0 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20  int regReturn = 
20e00 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
20e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
20e20 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20  ister used with 
20e30 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20  OP_Gosub */.    
20e40 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20  int regRowset = 
20e50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
20e70 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74  ister for RowSet
20e80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69   object */.    i
20e90 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
20ec0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77  ster holding row
20ed0 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  id */.    int iL
20ee0 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  oopBody = sqlite
20ef0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
20f00 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  );  /* Start of 
20f10 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
20f20 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20   int iRetInit;  
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
20f50 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75  dress of regRetu
20f60 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69  rn init */.    i
20f70 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73  nt untestedTerms
20f80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20f90 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20    /* Some terms 
20fa0 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74  not completely t
20fb0 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ested */.    int
20fc0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
20ff0 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e  */.    Expr *pAn
21000 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20  dExpr = 0;      
21010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
21020 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65  ".. AND (...)" e
21030 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
21040 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
21050 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
21060 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
21070 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
21080 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
21090 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20  tor & WO_OR );. 
210a0 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
210b0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
210c0 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
210d0 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
210e0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
210f0 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  c;.    pLevel->o
21100 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
21110 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
21120 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20  regReturn;..    
21130 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20  /* Set up a new 
21140 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61  SrcList in pOrTa
21150 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
21160 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61   table being sca
21170 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  nned.    ** by t
21180 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  his loop in the 
21190 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c  a[0] slot and al
211a0 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  l notReady table
211b0 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74  s in a[1..] slot
211c0 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  s..    ** This b
211d0 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69  ecomes the SrcLi
211e0 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  st in the recurs
211f0 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ive call to sqli
21200 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
21210 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21220 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
21230 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
21240 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
21250 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21260 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61  number of notRea
21270 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  dy tables */.   
21280 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
21290 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b  t_item *origSrc;
212a0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
212b0 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
212c0 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61  */.      nNotRea
212d0 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  dy = pWInfo->nLe
212e0 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31  vel - iLevel - 1
212f0 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  ;.      pOrTab =
21300 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
21310 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62  ocRaw(pParse->db
21320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
21340 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e  zeof(*pOrTab)+ n
21350 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28  NotReady*sizeof(
21360 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a  pOrTab->a[0]));.
21370 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62        if( pOrTab
21380 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74  ==0 ) return not
21390 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72  Ready;.      pOr
213a0 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69  Tab->nAlloc = (i
213b0 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20  16)(nNotReady + 
213c0 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  1);.      pOrTab
213d0 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d  ->nSrc = pOrTab-
213e0 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d  >nAlloc;.      m
213f0 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c  emcpy(pOrTab->a,
21400 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f   pTabItem, sizeo
21410 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20  f(*pTabItem));. 
21420 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70       origSrc = p
21430 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
21440 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  >a;.      for(k=
21450 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b  1; k<=nNotReady;
21460 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d   k++){.        m
21470 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61  emcpy(&pOrTab->a
21480 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c  [k], &origSrc[pL
21490 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20  evel[k].iFrom], 
214a0 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
214b0 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [k]));.      }. 
214c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
214d0 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d  pOrTab = pWInfo-
214e0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d  >pTabList;.    }
214f0 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
21500 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72  ize the rowset r
21510 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61  egister to conta
21520 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20  in NULL. An SQL 
21530 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20  NULL is .    ** 
21540 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e  equivalent to an
21550 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20   empty rowset.. 
21560 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
21570 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67  o initialize reg
21580 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69  Return to contai
21590 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
215a0 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
215b0 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61   .    ** immedia
215c0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
215d0 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20  he OP_Return at 
215e0 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  the bottom of th
215f0 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20  e loop. This.   
21600 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
21610 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65  in a few obscure
21620 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73   LEFT JOIN cases
21630 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a   where control j
21640 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72  umps.    ** over
21650 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
21660 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f  loop into the bo
21670 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69  dy of it. In thi
21680 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20  s case the .    
21690 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f  ** correct respo
216a0 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d  nse for the end-
216b0 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68  of-loop code (th
216c0 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20  e OP_Return) is 
216d0 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20  to .    ** fall 
216e0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
216f0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  ext instruction,
21700 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e   just as an OP_N
21710 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20  ext does if.    
21720 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  ** called on an 
21730 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75  uninitialized cu
21740 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rsor..    */.   
21750 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
21760 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
21770 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
21780 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52  =0 ){.      regR
21790 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  owset = ++pParse
217a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
217b0 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
217c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
217d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
217e0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
217f0 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20  regRowset);.    
21800 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d  }.    iRetInit =
21810 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21820 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
21830 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  , 0, regReturn);
21840 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
21850 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
21860 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68  lause is z of th
21870 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20  e form:  (x1 OR 
21880 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79  x2 OR ...) AND y
21890 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72  .    ** Then for
218a0 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20   every term xN, 
218b0 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20  evaluate as the 
218c0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78  subexpression: x
218d0 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54  N AND z.    ** T
218e0 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69  hat way, terms i
218f0 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63  n y that are fac
21900 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64  tored into the d
21910 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a  isjunction will.
21920 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64      ** be picked
21930 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72   up by the recur
21940 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71  sive calls to sq
21950 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
21960 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a  ) below..    **.
21970 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c      ** Actually,
21980 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
21990 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64  ion is converted
219a0 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77   to "xN AND w" w
219b0 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a  here w is.    **
219c0 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e   the "interestin
219d0 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20  g" terms of z - 
219e0 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e  terms that did n
219f0 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
21a00 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72  the.    ** ON or
21a10 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
21a20 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e   a LEFT JOIN, an
21a30 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  d terms that are
21a40 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20   usable as .    
21a50 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  ** indices..    
21a60 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f  **.    ** This o
21a70 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f  ptimization also
21a80 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66   only applies if
21a90 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f   the (x1 OR x2 O
21aa0 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20  R ...) term.    
21ab0 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
21ac0 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  ned in the ON cl
21ad0 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
21ae0 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  OIN..    ** See 
21af0 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77  ticket http://ww
21b00 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
21b10 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34  /info/f2369304e4
21b20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21b30 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a  pWC->nTerm>1 ){.
21b40 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b        int iTerm;
21b50 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d  .      for(iTerm
21b60 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e  =0; iTerm<pWC->n
21b70 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a  Term; iTerm++){.
21b80 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
21b90 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65  xpr = pWC->a[iTe
21ba0 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm].pExpr;.     
21bb0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
21bc0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21bd0 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e  _FromJoin) ) con
21be0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
21bf0 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  f( pWC->a[iTerm]
21c00 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  .wtFlags & (TERM
21c10 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 4f 52  _VIRTUAL|TERM_OR
21c20 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65  INFO) ) continue
21c30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
21c40 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70  WC->a[iTerm].eOp
21c50 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29  erator & WO_ALL)
21c60 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
21c70 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
21c80 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
21c90 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
21ca0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41  , 0);.        pA
21cb0 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
21cc0 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
21cd0 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45  db, pAndExpr, pE
21ce0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
21cf0 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
21d00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64   ){.        pAnd
21d10 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
21d20 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41  xpr(pParse, TK_A
21d30 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c  ND, 0, pAndExpr,
21d40 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
21d50 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   }..    for(ii=0
21d60 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72  ; ii<pOrWc->nTer
21d70 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  m; ii++){.      
21d80 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
21d90 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69  rm = &pOrWc->a[i
21da0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  i];.      if( pO
21db0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
21dc0 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54  r==iCur || (pOrT
21dd0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
21de0 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20   WO_AND)!=0 ){. 
21df0 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f         WhereInfo
21e00 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20   *pSubWInfo;    
21e10 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f        /* Info fo
21e20 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d  r single OR-term
21e30 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20   scan */.       
21e40 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d   Expr *pOrExpr =
21e50 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b   pOrTerm->pExpr;
21e60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 6e  .        if( pAn
21e70 64 45 78 70 72 20 26 26 20 21 45 78 70 72 48 61  dExpr && !ExprHa
21e80 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70  sProperty(pOrExp
21e90 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
21ea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e  ){.          pAn
21eb0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  dExpr->pLeft = p
21ec0 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  OrExpr;.        
21ed0 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64    pOrExpr = pAnd
21ee0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
21ef0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21f00 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
21f10 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
21f20 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
21f30 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49  /.        pSubWI
21f40 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
21f50 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
21f60 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c  pOrTab, pOrExpr,
21f70 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
21f90 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
21fa0 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44  LOSE | WHERE_AND
21fb0 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20  _ONLY |.        
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fd0 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
21fe0 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  E | WHERE_ONETAB
21ff0 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72  LE_ONLY, iCovCur
22000 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
22010 74 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20  t( pSubWInfo || 
22020 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
22030 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
22040 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
22050 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
22060 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  o ){.          W
22070 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f  hereLoop *pSubLo
22080 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78  op;.          ex
22090 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
220a0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
220b0 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75  se, pOrTab, &pSu
220c0 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c  bWInfo->a[0], iL
220d0 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  evel, pLevel->iF
220e0 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20  rom, 0.         
220f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
22100 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
22110 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
22120 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
22130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
22140 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d  nt iSet = ((ii==
22150 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f  pOrWc->nTerm-1)?
22160 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20  -1:ii);.        
22170 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20      int r;.     
22180 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74         r = sqlit
22190 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
221a0 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
221b0 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20  Item->pTab, -1, 
221c0 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20  iCur, .         
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221f0 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20  regRowid, 0);.  
22200 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22210 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
22220 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c  , OP_RowSetTest,
22230 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20   regRowset,.    
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
22260 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
22270 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65  ddr(v)+2, r, iSe
22280 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
22290 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
222a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
222b0 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75  P_Gosub, regRetu
222c0 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  rn, iLoopBody);.
222d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
222e0 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  e pSubWInfo->unt
222f0 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20  estedTerms flag 
22300 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
22310 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  OR term.        
22320 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f    ** contained o
22330 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74  ne or more AND t
22340 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65  erm from a notRe
22350 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a  ady table.  The.
22360 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72            ** ter
22370 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52  ms from the notR
22380 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64  eady table could
22390 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61   not be tested a
223a0 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20  nd will.        
223b0 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20    ** need to be 
223c0 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20  tested later..  
223d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
223e0 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
223f0 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
22400 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d  s ) untestedTerm
22410 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  s = 1;..        
22420 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    /* If all of t
22430 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  he OR-connected 
22440 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69  terms are optimi
22450 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  zed using the sa
22460 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  me.          ** 
22470 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69  index, and the i
22480 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75  ndex is opened u
22490 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75  sing the same cu
224a0 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20  rsor number.    
224b0 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68        ** by each
224c0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
224d0 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64  WhereBegin() mad
224e0 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20  e by this loop, 
224f0 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20  it may.         
22500 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20   ** be possible 
22510 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64 65  to use that inde
22520 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20  x as a covering 
22530 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
22540 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
22550 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
22560 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
22570 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74  n() above result
22580 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61  ed in a scan tha
22590 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
225a0 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e  ses an index, an
225b0 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  d this is either
225c0 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f   the first OR-co
225d0 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20  nnected term.   
225e0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
225f0 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78  sed or the index
22600 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
22610 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c  that used by all
22620 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
22630 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65      ** terms, se
22640 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61  t pCov to the ca
22650 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67  ndidate covering
22660 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73   index. Otherwis
22670 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  e, set .        
22680 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c    ** pCov to NUL
22690 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  L to indicate th
226a0 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20  at no candidate 
226b0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77  covering index w
226c0 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ill .          *
226d0 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a  * be available..
226e0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
226f0 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20         pSubLoop 
22700 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30  = pSubWInfo->a[0
22710 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  ].pWLoop;.      
22720 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f      if( (pSubLoo
22730 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
22740 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
22750 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53            && (pS
22760 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  ubLoop->wsFlags 
22770 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
22780 45 58 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  EX)==0.         
22790 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70    && (ii==0 || p
227a0 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
227b0 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20  .pIndex==pCov). 
227c0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
227d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
227e0 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
227f0 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72  iIdxCur==iCovCur
22800 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
22810 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d  pCov = pSubLoop-
22820 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
22830 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
22840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
22850 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ov = 0;.        
22860 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
22870 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f  * Finish the loo
22880 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
22890 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
228a0 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
228b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
228c0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53  lite3WhereEnd(pS
228d0 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  ubWInfo);.      
228e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
228f0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
22900 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a  pCovidx = pCov;.
22910 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70      if( pCov ) p
22920 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
22930 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66   iCovCur;.    if
22940 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
22950 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
22960 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  eft = 0;.      s
22970 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
22980 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e  (pParse->db, pAn
22990 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  dExpr);.    }.  
229a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
229b0 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69  ngeP1(v, iRetIni
229c0 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
229d0 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
229e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
229f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
22a00 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
22a10 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Brk);.    sqlite
22a20 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
22a30 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  l(v, iLoopBody);
22a40 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ..    if( pWInfo
22a50 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c  ->nLevel>1 ) sql
22a60 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 70 50  ite3StackFree(pP
22a70 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62  arse->db, pOrTab
22a80 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65  );.    if( !unte
22a90 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61  stedTerms ) disa
22aa0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
22ab0 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
22ac0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
22ad0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
22ae0 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
22af0 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68    /* Case 6:  Th
22b00 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
22b10 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
22b20 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
22b30 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
22b40 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
22b50 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
22b60 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
22b70 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
22b80 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
22b90 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
22ba0 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
22bb0 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
22bc0 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
22bd0 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
22be0 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
22bf0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53   pLevel->op = aS
22c00 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70  tep[bRev];.    p
22c10 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
22c20 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
22c30 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
22c40 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61  beAddOp2(v, aSta
22c50 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20  rt[bRev], iCur, 
22c60 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c  addrBrk);.    pL
22c70 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
22c80 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
22c90 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a  LSCAN_STEP;.  }.
22ca0 20 20 6e 65 77 4e 6f 74 52 65 61 64 79 20 3d 20    newNotReady = 
22cb0 6e 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d  notReady & ~getM
22cc0 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
22cd0 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20  skSet, iCur);.. 
22ce0 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
22cf0 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75  to test every su
22d00 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74  bexpression that
22d10 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65   can be complete
22d20 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  ly.  ** computed
22d30 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
22d40 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
22d50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
22d60 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
22d70 2d 34 39 35 32 35 2d 35 30 39 33 35 20 54 65 72  -49525-50935 Ter
22d80 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ms that cannot b
22d90 65 20 73 61 74 69 73 66 69 65 64 20 74 68 72 6f  e satisfied thro
22da0 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 75 73 65  ugh.  ** the use
22db0 20 6f 66 20 69 6e 64 69 63 65 73 20 62 65 63 6f   of indices beco
22dc0 6d 65 20 74 65 73 74 73 20 74 68 61 74 20 61 72  me tests that ar
22dd0 65 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69  e evaluated agai
22de0 6e 73 74 20 65 61 63 68 20 72 6f 77 20 6f 66 0a  nst each row of.
22df0 20 20 2a 2a 20 74 68 65 20 72 65 6c 65 76 61 6e    ** the relevan
22e00 74 20 69 6e 70 75 74 20 74 61 62 6c 65 73 2e 0a  t input tables..
22e10 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
22e20 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
22e30 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
22e40 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
22e50 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
22e60 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
22e70 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
22e80 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d 50 3a 20  TUAL ); /* IMP: 
22e90 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
22ea0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
22eb0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
22ec0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
22ed0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
22ee0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
22ef0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
22f00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22f10 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
22f20 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f 74 52  reqAll & newNotR
22f30 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
22f40 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
22f50 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
22f60 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  s==0.           
22f70 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
22f80 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22f90 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
22fa0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57  )!=0 );.      pW
22fb0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
22fc0 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63  rms = 1;.      c
22fd0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
22fe0 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
22ff0 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
23000 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pE!=0 );.    i
23010 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
23020 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73  Join && !ExprHas
23030 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
23040 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
23050 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
23060 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
23070 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
23080 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20  , pE, addrCont, 
23090 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
230a0 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77  L);.    pTerm->w
230b0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
230c0 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ODED;.  }..  /* 
230d0 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
230e0 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20  est for implied 
230f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65  constraints base
23100 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74  d on transitivit
23110 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d  y.  ** of the "=
23120 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  =" operator..  *
23130 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  *.  ** Example: 
23140 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
23150 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31  use contains "t1
23160 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32  .a=t2.b" and "t2
23170 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64  .b=123".  ** and
23180 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74   we are coding t
23190 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74  he t1 loop and t
231a0 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e  he t2 loop has n
231b0 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20  ot yet coded,.  
231c0 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f  ** then we canno
231d0 74 20 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d  t use the "t1.a=
231e0 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74  t2.b" constraint
231f0 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64  , but we can cod
23200 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69  e.  ** the impli
23210 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f  ed "t1.a=123" co
23220 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
23230 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
23240 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
23250 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
23260 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
23270 45 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  E;.    WhereTerm
23280 20 2a 70 41 6c 74 3b 0a 20 20 20 20 45 78 70 72   *pAlt;.    Expr
23290 20 73 45 71 3b 0a 20 20 20 20 69 66 28 20 70 54   sEq;.    if( pT
232a0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
232b0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
232c0 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
232d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
232e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28  rm->eOperator!=(
232f0 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20  WO_EQUIV|WO_EQ) 
23300 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23310 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
23320 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f  ursor!=iCur ) co
23330 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d  ntinue;.    pE =
23340 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
23350 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23360 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
23370 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a  EP_FromJoin) );.
23380 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
23390 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
233a0 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d  & newNotReady)!=
233b0 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20  0 );.    pAlt = 
233c0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
233d0 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ur, pTerm->u.lef
233e0 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64  tColumn, notRead
233f0 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
23400 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74  0);.    if( pAlt
23410 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
23420 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77 74      if( pAlt->wt
23430 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f  Flags & (TERM_CO
23440 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
23450 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
23460 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
23470 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74  transitive const
23480 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20 73 45  raint"));.    sE
23490 71 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72  q = *pAlt->pExpr
234a0 3b 0a 20 20 20 20 73 45 71 2e 70 4c 65 66 74 20  ;.    sEq.pLeft 
234b0 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  = pE->pLeft;.   
234c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
234d0 6c 73 65 28 70 50 61 72 73 65 2c 20 26 73 45 71  lse(pParse, &sEq
234e0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
234f0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
23500 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20    }..  /* For a 
23510 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
23520 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
23530 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20  hat will record 
23540 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
23550 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
23560 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74  row of the right
23570 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68   table has match
23580 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  ed the left tabl
23590 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e.  .  */.  if( 
235a0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
235b0 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n ){.    pLevel-
235c0 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c  >addrFirst = sql
235d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
235e0 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
235f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23600 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
23610 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
23620 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
23630 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20  ent((v, "record 
23640 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
23650 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
23660 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
23670 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  se);.    for(pTe
23680 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20  rm=pWC->a, j=0; 
23690 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  j<pWC->nTerm; j+
236a0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
236b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
236c0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
236d0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20 2f  RM_VIRTUAL );  /
236e0 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31  * IMP: R-30575-1
236f0 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 74 65  1662 */.      te
23700 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
23710 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
23720 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28  DED );.      if(
23730 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
23740 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
23750 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
23760 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
23770 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
23780 41 6c 6c 20 26 20 6e 65 77 4e 6f 74 52 65 61 64  All & newNotRead
23790 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  y)!=0 ){.       
237a0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
237b0 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  >untestedTerms )
237c0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
237d0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
237e0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
237f0 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
23800 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23810 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  se(pParse, pTerm
23820 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e  ->pExpr, addrCon
23830 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
23840 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65  NULL);.      pTe
23850 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
23860 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
23870 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
23880 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
23890 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67  rse, iReleaseReg
238a0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  );..  return new
238b0 4e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66  NotReady;.}..#if
238c0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
238d0 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
238e0 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  nt a WhereLoop o
238f0 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67  bject for debugg
23900 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a  ing purposes.*/.
23910 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
23920 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65  eLoopPrint(Where
23930 4c 6f 6f 70 20 2a 70 2c 20 53 72 63 4c 69 73 74  Loop *p, SrcList
23940 20 2a 70 54 61 62 4c 69 73 74 29 7b 0a 20 20 69   *pTabList){.  i
23950 6e 74 20 6e 62 20 3d 20 32 2a 28 28 70 54 61 62  nt nb = 2*((pTab
23960 4c 69 73 74 2d 3e 6e 53 72 63 2b 31 35 29 2f 31  List->nSrc+15)/1
23970 36 29 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  6);.  struct Src
23980 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23990 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b   = pTabList->a +
239a0 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c   p->iTab;.  Tabl
239b0 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
239c0 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
239d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63 20  DebugPrintf("%c 
239e0 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c  %2d.%0*llx.%0*ll
239f0 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20  x", p->cId,.    
23a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a10 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d   p->iTab, nb, p-
23a20 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70  >maskSelf, nb, p
23a30 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c  ->prereq);.  sql
23a40 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23a50 22 20 25 38 73 22 2c 0a 20 20 20 20 20 20 20 20  " %8s",.        
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
23a70 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
23a80 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
23a90 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
23aa0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
23ab0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
23ac0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  E)==0 ){.    if(
23ad0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
23ae0 65 78 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ex ){.      cons
23af0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
23b00 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
23b10 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  x->zName;.      
23b20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a  if( zName==0 ) z
23b30 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b 0a 20 20  Name = "ipk";.  
23b40 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
23b50 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
23b60 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
23b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
23b80 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
23b90 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
23ba0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
23bb0 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
23bc0 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
23bd0 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
23be0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
23bf0 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
23c00 32 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  2s %2d", zName, 
23c10 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
23c20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23c30 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23c40 69 6e 74 66 28 22 25 31 36 73 22 2c 22 22 29 3b  intf("%16s","");
23c50 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
23c60 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
23c70 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
23c80 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
23c90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
23ca0 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
23cb0 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
23cc0 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
23cd0 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
23ce0 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
23cf0 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
23d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
23d10 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
23d20 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
23d30 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
23d40 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
23d50 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
23d60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23d70 66 28 22 20 25 2d 31 35 73 22 2c 20 7a 29 3b 0a  f(" %-15s", z);.
23d80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23d90 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (z);.  }.  sqlit
23da0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
23db0 66 67 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70  fg %05x N %d", p
23dc0 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c  ->wsFlags, p->nL
23dd0 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  Term);.  sqlite3
23de0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f  DebugPrintf(" co
23df0 73 74 20 25 2e 32 67 2c 25 2e 32 67 2c 25 2e 32  st %.2g,%.2g,%.2
23e00 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  g\n",.          
23e10 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 72             p->pr
23e20 65 72 65 71 2c 20 70 2d 3e 72 53 65 74 75 70 2c  ereq, p->rSetup,
23e30 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
23e40 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
23e50 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b  .** Convert bulk
23e60 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76   memory into a v
23e70 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74  alid WhereLoop t
23e80 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65  hat can be passe
23e90 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f  d.** to whereLoo
23ea0 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c  pClear harmlessl
23eb0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
23ec0 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28  d whereLoopInit(
23ed0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
23ee0 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e   p->aLTerm = p->
23ef0 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70  aLTermSpace;.  p
23f00 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
23f10 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61  p->nLSlot = Arra
23f20 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53  ySize(p->aLTermS
23f30 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c  pace);.  p->wsFl
23f40 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ags = 0;.}../*.*
23f50 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72  * Clear the Wher
23f60 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20  eLoop.u union.  
23f70 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e  Leave WhereLoop.
23f80 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a  pLTerm intact..*
23f90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
23fa0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
23fb0 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  n(sqlite3 *db, W
23fc0 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
23fd0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
23fe0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
23ff0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
24000 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65  if( p->u.vtab.ne
24010 65 64 46 72 65 65 20 29 20 73 71 6c 69 74 65 33  edFree ) sqlite3
24020 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
24030 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 2d 3e  idxStr);.    p->
24040 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
24050 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 75 2e 76 74  = 0;.    p->u.vt
24060 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  ab.idxStr = 0;. 
24070 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77   }else if( (p->w
24080 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
24090 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20 26 26  EMP_INDEX)!=0 &&
240a0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
240b0 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex!=0 ){.    sql
240c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
240d0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
240e0 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
240f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24100 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
24110 64 65 78 29 3b 0a 20 20 20 20 70 2d 3e 75 2e 62  dex);.    p->u.b
24120 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
24130 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  .  }.}.../*.** D
24140 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
24150 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
24160 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
24170 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
24180 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
24190 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
241a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
241b0 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
241c0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
241d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
241e0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
241f0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
24200 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
24210 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
24220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
24230 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
24240 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
24250 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
24260 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
24270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
24280 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
24290 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
242a0 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
242b0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
242c0 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
242d0 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
242e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
242f0 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
24300 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
24310 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
24320 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
24330 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
24340 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
24350 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
24360 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61  mcpy(paNew, p->a
24370 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d  LTerm, sizeof(p-
24380 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e  >aLTerm[0])*p->n
24390 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d  LSlot);.  if( p-
243a0 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
243b0 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
243c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
243d0 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54  LTerm);.  p->aLT
243e0 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70  erm = paNew;.  p
243f0 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20  ->nLSlot = n;.  
24400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
24420 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  fer content from
24430 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f   the second pLoo
24440 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74  p into the first
24450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24460 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71  whereLoopXfer(sq
24470 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
24480 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65  Loop *pTo, Where
24490 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  Loop *pFrom){.  
244a0 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
244b0 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72  ize(db, pTo, pFr
244c0 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 20 72 65  om->nLTerm) ) re
244d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
244e0 4d 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  M;.  whereLoopCl
244f0 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f  earUnion(db, pTo
24500 29 3b 0a 20 20 70 54 6f 2d 3e 70 72 65 72 65 71  );.  pTo->prereq
24510 20 3d 20 70 46 72 6f 6d 2d 3e 70 72 65 72 65 71   = pFrom->prereq
24520 3b 0a 20 20 70 54 6f 2d 3e 6d 61 73 6b 53 65 6c  ;.  pTo->maskSel
24530 66 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 53  f = pFrom->maskS
24540 65 6c 66 3b 0a 20 20 70 54 6f 2d 3e 69 54 61 62  elf;.  pTo->iTab
24550 20 3d 20 70 46 72 6f 6d 2d 3e 69 54 61 62 3b 0a   = pFrom->iTab;.
24560 20 20 70 54 6f 2d 3e 69 53 6f 72 74 49 64 78 20    pTo->iSortIdx 
24570 3d 20 70 46 72 6f 6d 2d 3e 69 53 6f 72 74 49 64  = pFrom->iSortId
24580 78 3b 0a 20 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d  x;.  pTo->nLTerm
24590 20 3d 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d   = pFrom->nLTerm
245a0 3b 0a 20 20 70 54 6f 2d 3e 72 53 65 74 75 70 20  ;.  pTo->rSetup 
245b0 3d 20 70 46 72 6f 6d 2d 3e 72 53 65 74 75 70 3b  = pFrom->rSetup;
245c0 0a 20 20 70 54 6f 2d 3e 72 52 75 6e 20 3d 20 70  .  pTo->rRun = p
245d0 46 72 6f 6d 2d 3e 72 52 75 6e 3b 0a 20 20 70 54  From->rRun;.  pT
245e0 6f 2d 3e 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d  o->nOut = pFrom-
245f0 3e 6e 4f 75 74 3b 0a 20 20 69 66 28 20 70 54 6f  >nOut;.  if( pTo
24600 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 20 20 20 20  ->nLTerm ){.    
24610 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
24620 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
24630 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
24640 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
24650 6d 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 70 54  m[0]));.  }.  pT
24660 6f 2d 3e 77 73 46 6c 61 67 73 20 3d 20 70 46 72  o->wsFlags = pFr
24670 6f 6d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 70  om->wsFlags;.  p
24680 54 6f 2d 3e 75 20 3d 20 70 46 72 6f 6d 2d 3e 75  To->u = pFrom->u
24690 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77  ;.  if( pFrom->w
246a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
246b0 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
246c0 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62     pFrom->u.vtab
246d0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
246e0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f   }else if( (pFro
246f0 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
24700 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d  RE_TEMP_INDEX)!=
24710 30 20 26 26 20 70 46 72 6f 6d 2d 3e 75 2e 62 74  0 && pFrom->u.bt
24720 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
24730 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
24740 65 65 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 75 2e  ee(db, pFrom->u.
24750 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43  btree.pIndex->zC
24760 6f 6c 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69  olAff);.    sqli
24770 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
24780 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  rom->u.btree.pIn
24790 64 65 78 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  dex);.    pFrom-
247a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
247b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
247c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
247d0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57  /*.** Delete a W
247e0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
247f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
24800 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73  hereLoopDelete(s
24810 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
24820 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65  eLoop *p){.  whe
24830 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
24840 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
24850 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
24860 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
24870 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
24880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
24890 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
248a0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
248b0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
248c0 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66  if( ALWAYS(pWInf
248d0 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43  o) ){.    whereC
248e0 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e  lauseClear(&pWIn
248f0 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68  fo->sWC);.    wh
24900 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ile( pWInfo->pLo
24910 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ops ){.      Whe
24920 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e  reLoop *p = pWIn
24930 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20  fo->pLoops;.    
24940 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73    pWInfo->pLoops
24950 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
24960 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
24970 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
24980 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24990 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
249a0 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
249b0 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61   Insert or repla
249c0 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65  ce a WhereLoop e
249d0 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74  ntry using the t
249e0 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64  emplate supplied
249f0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
24a00 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  ing WhereLoop en
24a10 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65  try might be ove
24a20 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
24a30 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20  new template.** 
24a40 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61  is better and ha
24a50 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  s fewer dependen
24a60 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65  cies.  Or the te
24a70 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69  mplate will be i
24a80 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f  gnored.** and no
24a90 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63   insert will occ
24aa0 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ur if an existin
24ab0 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66  g WhereLoop is f
24ac0 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a  aster and has.**
24ad0 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
24ae0 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d  ies than the tem
24af0 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73  plate.  Otherwis
24b00 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
24b10 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61  p is.** added ba
24b20 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c  sed on the templ
24b30 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ate..**.** If pB
24b40 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73  uilder->pBest is
24b50 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77   not NULL then w
24b60 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
24b70 74 20 74 68 65 20 76 65 72 79 0a 2a 2a 20 62 65  t the very.** be
24b80 73 74 20 74 65 6d 70 6c 61 74 65 20 61 6e 64 20  st template and 
24b90 74 68 61 74 20 74 65 6d 70 6c 61 74 65 20 73 68  that template sh
24ba0 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
24bb0 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73  n pBuilder->pBes
24bc0 74 2e 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65  t..** If pBuilde
24bd0 72 2d 3e 70 42 65 73 74 20 69 73 20 4e 55 4c 4c  r->pBest is NULL
24be0 20 74 68 65 6e 20 61 20 6c 69 73 74 20 6f 66 20   then a list of 
24bf0 74 68 65 20 62 65 73 74 20 74 65 6d 70 6c 61 74  the best templat
24c00 65 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  es are stored.**
24c10 20 69 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 57   in pBuilder->pW
24c20 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2e 0a 2a 2a  Info->pLoops..**
24c30 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c  .** When accumul
24c40 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c  ating multiple l
24c50 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c  oops (when pBuil
24c60 64 65 72 2d 3e 70 42 65 73 74 20 69 73 20 4e 55  der->pBest is NU
24c70 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20  LL) we.** still 
24c80 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
24c90 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69  similar loops wi
24ca0 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  th the new templ
24cb0 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 74 65  ate if the.** te
24cc0 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
24cd0 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20  .  Loops may be 
24ce0 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
24cf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  he following .**
24d00 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20   conditions are 
24d10 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  met:.**.**    (1
24d20 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65  )  They have the
24d30 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20   same iTab..**  
24d40 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76 65    (2)  They have
24d50 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49   the same iSortI
24d60 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54  dx..**    (3)  T
24d70 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
24d80 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65  same or fewer de
24d90 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
24da0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
24db0 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65 20  .**    (4)  The 
24dc0 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65  template has the
24dd0 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63   same or lower c
24de0 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75 72  ost than the cur
24df0 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20  rent loop.**    
24e00 28 35 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (5)  The templat
24e10 65 20 75 73 65 73 20 6d 6f 72 65 20 74 65 72 6d  e uses more term
24e20 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 69 6e  s of the same in
24e30 64 65 78 20 62 75 74 20 68 61 73 20 6e 6f 20 61  dex but has no a
24e40 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20 20  dditional.**    
24e50 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65       dependencie
24e60 73 20 20 20 20 20 20 20 20 20 20 0a 2a 2f 0a 73  s          .*/.s
24e70 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
24e80 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c  oopInsert(WhereL
24e90 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
24ea0 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20  lder, WhereLoop 
24eb0 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57  *pTemplate){.  W
24ec0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
24ed0 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d 20  v, *p, *pNext = 
24ee0 30 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  0;.  WhereInfo *
24ef0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
24f00 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c  r->pWInfo;.  sql
24f10 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
24f20 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a  o->pParse->db;..
24f30 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72    /* If pBuilder
24f40 2d 3e 70 42 65 73 74 20 69 73 20 64 65 66 69 6e  ->pBest is defin
24f50 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65  ed, then only ke
24f60 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
24f70 73 69 6e 67 6c 65 0a 20 20 2a 2a 20 62 65 73 74  single.  ** best
24f80 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 70 42 75   WhereLoop.  pBu
24f90 69 6c 64 65 72 2d 3e 70 42 65 73 74 2d 3e 6d 61  ilder->pBest->ma
24fa0 73 6b 53 65 6c 66 3d 3d 30 20 69 6e 64 69 63 61  skSelf==0 indica
24fb0 74 65 73 20 74 68 61 74 20 6e 6f 0a 20 20 2a 2a  tes that no.  **
24fc0 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70   prior WhereLoop
24fd0 73 20 68 61 76 65 20 62 65 65 6e 20 65 76 61 6c  s have been eval
24fe0 75 61 74 65 64 20 61 6e 64 20 74 68 61 74 20 74  uated and that t
24ff0 68 65 20 63 75 72 72 65 6e 74 20 70 54 65 6d 70  he current pTemp
25000 6c 61 74 65 0a 20 20 2a 2a 20 69 73 20 74 68 65  late.  ** is the
25010 72 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  refore the first
25020 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 62   and hence the b
25030 65 73 74 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  est and should b
25040 65 20 72 65 74 61 69 6e 65 64 2e 0a 20 20 2a 2f  e retained..  */
25050 0a 20 20 69 66 28 20 28 70 20 3d 20 70 42 75 69  .  if( (p = pBui
25060 6c 64 65 72 2d 3e 70 42 65 73 74 29 21 3d 30 20  lder->pBest)!=0 
25070 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61  ){.    if( p->ma
25080 73 6b 53 65 6c 66 21 3d 30 20 29 7b 0a 20 20 20  skSelf!=0 ){.   
25090 20 20 20 57 68 65 72 65 43 6f 73 74 20 72 43 6f     WhereCost rCo
250a0 73 74 20 3d 20 70 2d 3e 72 52 75 6e 20 2b 20 70  st = p->rRun + p
250b0 2d 3e 72 53 65 74 75 70 3b 0a 20 20 20 20 20 20  ->rSetup;.      
250c0 57 68 65 72 65 43 6f 73 74 20 72 54 65 6d 70 6c  WhereCost rTempl
250d0 61 74 65 20 3d 20 70 54 65 6d 70 6c 61 74 65 2d  ate = pTemplate-
250e0 3e 72 52 75 6e 20 2b 20 70 54 65 6d 70 6c 61 74  >rRun + pTemplat
250f0 65 2d 3e 72 53 65 74 75 70 3b 0a 20 20 20 20 20  e->rSetup;.     
25100 20 69 66 28 20 72 43 6f 73 74 20 3c 20 72 54 65   if( rCost < rTe
25110 6d 70 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  mplate ){.      
25120 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
25130 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20  Insert_noop;.   
25140 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
25150 43 6f 73 74 20 3d 3d 20 72 54 65 6d 70 6c 61 74  Cost == rTemplat
25160 65 20 26 26 20 70 2d 3e 70 72 65 72 65 71 20 3c  e && p->prereq <
25170 3d 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  = pTemplate->pre
25180 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 67  req ){.        g
25190 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  oto whereLoopIns
251a0 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20  ert_noop;.      
251b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72  }.    }.    wher
251c0 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c  eLoopXfer(db, p,
251d0 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 23 69 66   pTemplate);.#if
251e0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
251f0 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
25200 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
25210 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  0x8 ){.      sql
25220 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25230 22 69 6e 73 2d 62 65 73 74 3a 20 22 29 3b 0a 20  "ins-best: ");. 
25240 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
25250 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
25260 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29  WInfo->pTabList)
25270 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
25280 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25290 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  _OK;.  }..  /* S
252a0 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
252b0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
252c0 74 6f 20 6f 76 65 72 77 72 69 74 65 2c 20 6f 72  to overwrite, or
252d0 20 77 68 69 63 68 20 74 61 6b 65 73 0a 20 20 2a   which takes.  *
252e0 2a 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72 20  * priority over 
252f0 70 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a  pTemplate..  */.
25300 20 20 66 6f 72 28 70 70 50 72 65 76 3d 26 70 57    for(ppPrev=&pW
25310 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d  Info->pLoops, p=
25320 2a 70 70 50 72 65 76 3b 20 70 3b 20 70 70 50 72  *ppPrev; p; ppPr
25330 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ev=&p->pNextLoop
25340 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20  , p=*ppPrev){.  
25350 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
25360 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c  Template->iTab |
25370 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70  | p->iSortIdx!=p
25380 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49  Template->iSortI
25390 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  dx ) continue;. 
253a0 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
253b0 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
253c0 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
253d0 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65  q.     && p->rSe
253e0 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup<=pTemplate->
253f0 72 53 65 74 75 70 0a 20 20 20 20 20 26 26 20 70  rSetup.     && p
25400 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74  ->rRun<=pTemplat
25410 65 2d 3e 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20  e->rRun.    ){. 
25420 20 20 20 20 20 2f 2a 20 70 20 69 73 20 65 71 75       /* p is equ
25430 61 6c 20 6f 72 20 62 65 74 74 65 72 20 74 68 61  al or better tha
25440 6e 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  n pTemplate */. 
25450 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65       if( p->nLTe
25460 72 6d 3c 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c  rm<pTemplate->nL
25470 54 65 72 6d 0a 20 20 20 20 20 20 20 26 26 20 28  Term.       && (
25480 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
25490 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
254a0 20 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c        && (pTempl
254b0 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
254c0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
254d0 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 75 2e  .       && p->u.
254e0 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54  btree.pIndex==pT
254f0 65 6d 70 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65  emplate->u.btree
25500 2e 70 49 6e 64 65 78 0a 20 20 20 20 20 20 20 26  .pIndex.       &
25510 26 20 70 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65  & p->prereq==pTe
25520 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
25530 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
25540 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20  /* Overwrite an 
25550 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
25560 6f 70 20 77 69 74 68 20 61 6e 20 73 69 6d 69 6c  op with an simil
25570 61 72 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73  ar one that uses
25580 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65  .        ** more
25590 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
255a0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  dex */.        p
255b0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c  Next = p->pNextL
255c0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 77 68 65  oop;.        whe
255d0 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
255e0 70 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p);.        brea
255f0 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
25600 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 6d 70          /* pTemp
25610 6c 61 74 65 20 69 73 20 6e 6f 74 20 68 65 6c 70  late is not help
25620 66 75 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ful..        ** 
25630 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 63  Return without c
25640 68 61 6e 67 69 6e 67 20 6f 72 20 61 64 64 69 6e  hanging or addin
25650 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
25660 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
25670 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b  LoopInsert_noop;
25680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25690 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
256a0 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
256b0 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74  rereq)==pTemplat
256c0 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26  e->prereq.     &
256d0 26 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  & p->rSetup>=pTe
256e0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20  mplate->rSetup. 
256f0 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
25700 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a  pTemplate->rRun.
25710 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
25720 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69  Overwrite an exi
25730 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
25740 77 69 74 68 20 61 20 62 65 74 74 65 72 20 6f 6e  with a better on
25750 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74  e */.      pNext
25760 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
25770 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
25780 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20  Clear(db, p);.  
25790 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
257a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
257b0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
257c0 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  t it means that 
257d0 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c  either p[] shoul
257e0 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  d be overwritten
257f0 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70  .  ** with pTemp
25800 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78  late[] if p[] ex
25810 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e  ists, or if p==N
25820 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ULL then allocat
25830 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65  e a new.  ** Whe
25840 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72  reLoop and inser
25850 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57  t it..  */.#if W
25860 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
25870 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
25880 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
25890 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20  ){.    if( p!=0 
258a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
258b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73  DebugPrintf("ins
258c0 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20  -del:  ");.     
258d0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
258e0 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  p, pWInfo->pTabL
258f0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
25900 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25910 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29  tf("ins-new:  ")
25920 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50  ;.    whereLoopP
25930 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
25940 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
25950 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
25960 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
25970 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
25980 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
25990 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
259a0 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
259b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
259c0 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  M;.    whereLoop
259d0 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77  Init(p);.  }.  w
259e0 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c  hereLoopXfer(db,
259f0 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a   p, pTemplate);.
25a00 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d    p->pNextLoop =
25a10 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72 65   pNext;.  *ppPre
25a20 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70 2d  v = p;.  if( (p-
25a30 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25a40 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
25a50 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
25a60 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74  pIndex = p->u.bt
25a70 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
25a80 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49  if( pIndex && pI
25a90 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b  ndex->tnum==0 ){
25aa0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
25ab0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
25ac0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25ad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
25ae0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
25af0 68 65 20 69 6e 73 65 72 74 20 69 73 20 61 20 6e  he insert is a n
25b00 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f  o-op */.whereLoo
25b10 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69  pInsert_noop:.#i
25b20 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
25b30 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
25b40 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
25b50 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  x8 ){.    sqlite
25b60 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
25b70 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20  s-noop: ");.    
25b80 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
25b90 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f  Template, pWInfo
25ba0 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d  ->pTabList);.  }
25bb0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
25bc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a   SQLITE_OK;  .}.
25bd0 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73  ./*.** We have s
25be0 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42  o far matched pB
25bf0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
25c00 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20  btree.nEq terms 
25c10 6f 66 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e  of the index pIn
25c20 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d  dex..** Try to m
25c30 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a  atch one more..*
25c40 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e  *.** If pProbe->
25c50 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tnum==0, that me
25c60 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20  ans pIndex is a 
25c70 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20  fake index used 
25c80 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47  for the.** INTEG
25c90 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
25ca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
25cb0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
25cc0 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ndex(.  WhereLoo
25cd0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
25ce0 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  er,     /* The W
25cf0 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79  hereLoop factory
25d00 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
25d10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
25d20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
25d30 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
25d40 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
25d50 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20  dex *pProbe,    
25d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d70 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72   An index on pSr
25d80 63 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 4d 75  c */.  int nInMu
25d90 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
25da0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25db0 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64   of iterations d
25dc0 75 65 20 74 6f 20 49 4e 20 2a 2f 0a 29 7b 0a 20  ue to IN */.){. 
25dd0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
25de0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
25df0 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45  WInfo;  /* WHERE
25e00 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74   analyse context
25e10 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
25e20 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
25e30 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  arse;        /* 
25e40 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
25e50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
25e60 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
25e70 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
25e80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c   connection mall
25e90 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  oc context */.  
25ea0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ec0 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
25ed0 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73  eLoop under cons
25ee0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  truction */.  Wh
25ef0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f10 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64   A WhereTerm und
25f20 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
25f30 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b   */.  int opMask
25f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25f50 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f        /* Valid o
25f60 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e  perators for con
25f70 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68  straints */.  Wh
25f80 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20  ereScan scan;   
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25fa0 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48   Iterator for WH
25fb0 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42  ERE terms */.  B
25fc0 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65  itmask saved_pre
25fd0 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f  req;           /
25fe0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
25ff0 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71   of pNew->prereq
26000 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
26010 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  nLTerm;         
26020 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
26030 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
26040 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  >nLTerm */.  int
26050 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20   saved_nEq;     
26060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26070 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
26080 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
26090 6e 45 71 20 2a 2f 0a 20 20 75 33 32 20 73 61 76  nEq */.  u32 sav
260a0 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20  ed_wsFlags;     
260b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
260c0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
260d0 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20  ew->wsFlags */. 
260e0 20 57 68 65 72 65 43 6f 73 74 20 73 61 76 65 64   WhereCost saved
260f0 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20  _nOut;          
26100 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
26110 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74  ue of pNew->nOut
26120 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26140 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
26150 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  f the column in 
26160 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
26170 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26180 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
26190 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
261a0 0a 20 20 74 52 6f 77 63 6e 74 20 69 52 6f 77 45  .  tRowcnt iRowE
261b0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
261c0 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
261d0 69 6e 64 65 78 20 73 65 6c 65 63 74 69 76 69 74  index selectivit
261e0 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  y */.  WhereCost
261f0 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20   rLogSize;      
26200 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
26210 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a  thm of table siz
26220 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
26230 20 2a 70 54 6f 70 2c 20 2a 70 42 74 6d 3b 20 20   *pTop, *pBtm;  
26240 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 61 6e         /* Top an
26250 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63  d bottom range c
26260 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20  onstraints */.. 
26270 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
26280 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62  ->pNew;.  if( db
26290 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
262a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
262b0 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28  OMEM;..  assert(
262c0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
262d0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
262e0 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ABLE)==0 );.  as
262f0 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
26300 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d  ree.nEq<=pProbe-
26310 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
26320 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
26330 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
26340 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20  _LIMIT)==0 );.  
26350 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
26360 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
26370 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  MIT ){.    opMas
26380 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  k = WO_LT|WO_LE;
26390 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72  .  }else if( pPr
263a0 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20  obe->tnum<=0 || 
263b0 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20  (pSrc->jointype 
263c0 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
263d0 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
263e0 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c  _EQ|WO_IN|WO_GT|
263f0 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
26400 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
26410 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  opMask = WO_EQ|W
26420 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_IN|WO_ISNULL|W
26430 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
26440 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66  |WO_LE;.  }.  if
26450 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  ( pProbe->bUnord
26460 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d  ered ) opMask &=
26470 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57   ~(WO_GT|WO_GE|W
26480 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20  O_LT|WO_LE);..  
26490 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  if( pNew->u.btre
264a0 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e  e.nEq < pProbe->
264b0 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 69  nColumn ){.    i
264c0 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Col = pProbe->ai
264d0 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62  Column[pNew->u.b
264e0 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20 20 20 69  tree.nEq];.    i
264f0 52 6f 77 45 73 74 20 3d 20 70 50 72 6f 62 65 2d  RowEst = pProbe-
26500 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e  >aiRowEst[pNew->
26510 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d 3b 0a  u.btree.nEq+1];.
26520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f    }else{.    iCo
26530 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 52 6f 77  l = -1;.    iRow
26540 45 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  Est = 1;.  }.  p
26550 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
26560 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69  Init(&scan, pBui
26570 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d  lder->pWC, pSrc-
26580 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a  >iCursor, iCol,.
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265a0 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20          opMask, 
265b0 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64  pProbe);.  saved
265c0 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  _nEq = pNew->u.b
265d0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65  tree.nEq;.  save
265e0 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  d_nLTerm = pNew-
265f0 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64  >nLTerm;.  saved
26600 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d  _wsFlags = pNew-
26610 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65  >wsFlags;.  save
26620 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d  d_prereq = pNew-
26630 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64  >prereq;.  saved
26640 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f  _nOut = pNew->nO
26650 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  ut;.  pNew->rSet
26660 75 70 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29  up = (WhereCost)
26670 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  0;.  rLogSize = 
26680 65 73 74 4c 6f 67 28 70 50 72 6f 62 65 2d 3e 61  estLog(pProbe->a
26690 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20 66  iRowEst[0]);.  f
266a0 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
266b0 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20  OK && pTerm!=0; 
266c0 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
266d0 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20  nNext(&scan)){. 
266e0 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 31 3b 0a     int nIn = 1;.
266f0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
26700 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
26710 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
26720 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 4e 65 77  ntinue;.    pNew
26730 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
26740 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
26750 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
26760 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
26770 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
26780 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
26790 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
267a0 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
267b0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
267c0 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
267d0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
267e0 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
267f0 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
26800 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
26810 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
26820 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
26830 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
26840 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77  skSelf;.    pNew
26850 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a  ->rRun = rLogSiz
26860 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
26870 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
26880 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  _IN ){.      Exp
26890 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
268a0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ->pExpr;.      p
268b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
268c0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
268d0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
268e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
268f0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
26900 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
26910 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
26920 22 3a 20 20 41 73 73 75 6d 65 20 74 68 65 20 53  ":  Assume the S
26930 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35  ELECT returns 25
26940 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20   rows */.       
26950 20 6e 49 6e 20 3d 20 32 35 3b 0a 20 20 20 20 20   nIn = 25;.     
26960 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
26970 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
26980 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
26990 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
269a0 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
269b0 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
269c0 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  .)" */.        n
269d0 49 6e 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  In = pExpr->x.pL
269e0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
269f0 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
26a00 72 52 75 6e 20 2a 3d 20 6e 49 6e 3b 0a 20 20 20  rRun *= nIn;.   
26a10 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
26a20 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e  .nEq++;.      pN
26a30 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65 72  ew->nOut = (Wher
26a40 65 43 6f 73 74 29 69 52 6f 77 45 73 74 20 2a 20  eCost)iRowEst * 
26a50 6e 49 6e 4d 75 6c 20 2a 20 6e 49 6e 3b 0a 20 20  nInMul * nIn;.  
26a60 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
26a70 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
26a80 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20  WO_EQ) ){.      
26a90 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
26aa0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
26ab0 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52  COLUMN_NULL|WHER
26ac0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30  E_COLUMN_IN))!=0
26ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26ae0 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 31 20     || nInMul==1 
26af0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
26b00 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
26b10 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
26b20 20 69 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20 20   if( iCol<0  .  
26b30 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d       || (pProbe-
26b40 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
26b50 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 31 0a 20  e && nInMul==1. 
26b60 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65            && pNe
26b70 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d  w->u.btree.nEq==
26b80 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d  pProbe->nColumn-
26b90 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
26ba0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e      testcase( pN
26bb0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
26bc0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b  ERE_COLUMN_IN );
26bd0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
26be0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
26bf0 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a  ONEROW;.      }.
26c00 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
26c10 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
26c20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 57   pNew->nOut = (W
26c30 68 65 72 65 43 6f 73 74 29 69 52 6f 77 45 73 74  hereCost)iRowEst
26c40 20 2a 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d   * nInMul;.    }
26c50 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
26c60 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
26c70 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ISNULL) ){.     
26c80 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
26c90 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  = WHERE_COLUMN_N
26ca0 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ULL;.      pNew-
26cb0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
26cc0 20 20 20 20 20 20 6e 49 6e 20 3d 20 32 3b 20 20        nIn = 2;  
26cd0 2f 2a 20 41 73 73 75 6d 65 20 49 53 20 4e 55 4c  /* Assume IS NUL
26ce0 4c 20 6d 61 74 63 68 65 73 20 74 77 6f 20 72 6f  L matches two ro
26cf0 77 73 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ws */.      pNew
26d00 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65 72 65 43  ->nOut = (WhereC
26d10 6f 73 74 29 69 52 6f 77 45 73 74 20 2a 20 6e 49  ost)iRowEst * nI
26d20 6e 4d 75 6c 20 2a 20 6e 49 6e 3b 0a 20 20 20 20  nMul * nIn;.    
26d30 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
26d40 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
26d50 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20  _GT|WO_GE) ){.  
26d60 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
26d70 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
26d80 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54  N_RANGE|WHERE_BT
26d90 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  M_LIMIT;.      p
26da0 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Btm = pTerm;.   
26db0 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20     pTop = 0;.   
26dc0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
26dd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
26de0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 7b 0a 20  O_LT|WO_LE) ){. 
26df0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
26e00 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
26e10 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
26e20 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
26e30 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
26e40 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
26e50 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
26e60 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
26e70 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
26e80 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
26e90 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
26ea0 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20  -2] : 0;.    }. 
26eb0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
26ec0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
26ed0 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
26ee0 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75     /* Adjust nOu
26ef0 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20 53  t and rRun for S
26f00 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75 65  TAT3 range value
26f10 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72 65  s */.      Where
26f20 43 6f 73 74 20 72 44 69 76 3b 0a 20 20 20 20 20  Cost rDiv;.     
26f30 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
26f40 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62  st(pParse, pProb
26f50 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  e, pNew->u.btree
26f60 2e 6e 45 71 2c 0a 20 20 20 20 20 20 20 20 20 20  .nEq,.          
26f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
26f80 74 6d 2c 20 70 54 6f 70 2c 20 26 72 44 69 76 29  tm, pTop, &rDiv)
26f90 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
26fa0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 2f  ut = saved_nOut/
26fb0 72 44 69 76 3b 0a 20 20 20 20 7d 0a 23 69 66 64  rDiv;.    }.#ifd
26fc0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
26fd0 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28 20 70  _STAT3.    if( p
26fe0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
26ff0 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e  ==1 && pProbe->n
27000 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
27010 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
27020 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
27030 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b  O_ISNULL))!=0 ){
27040 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
27050 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
27060 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20  pParse, pProbe, 
27070 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
27080 69 67 68 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ight,.          
27090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270a0 20 20 20 20 20 26 70 4e 65 77 2d 3e 6e 4f 75 74       &pNew->nOut
270b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
270c0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
270d0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 0a 20 20  ator & WO_IN).  
270e0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 20 21             &&  !
270f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
27100 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
27110 5f 78 49 73 53 65 6c 65 63 74 29 20 20 29 7b 0a  _xIsSelect)  ){.
27120 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
27130 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
27140 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 54 65 72  se, pProbe, pTer
27150 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  m->pExpr->x.pLis
27160 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
27170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27180 26 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 0a 20  &pNew->nOut);.. 
27190 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
271a0 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77  dif.    if( pNew
271b0 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
271c0 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
271d0 45 5f 49 50 4b 29 20 29 7b 0a 20 20 20 20 20 20  E_IPK) ){.      
271e0 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 70 4e  pNew->rRun += pN
271f0 65 77 2d 3e 6e 4f 75 74 3b 20 20 2f 2a 20 55 6e  ew->nOut;  /* Un
27200 69 74 20 73 74 65 70 20 63 6f 73 74 20 74 6f 20  it step cost to 
27210 72 65 61 63 68 20 65 61 63 68 20 72 6f 77 20 2a  reach each row *
27220 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
27230 20 20 20 2f 2a 20 45 61 63 68 20 72 6f 77 20 69     /* Each row i
27240 6e 76 6f 6c 76 65 73 20 61 20 73 74 65 70 20 6f  nvolves a step o
27250 66 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65  f the index, the
27260 6e 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  n a binary searc
27270 68 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  h of.      ** th
27280 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a  e main table */.
27290 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
272a0 20 2b 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 2a 28   += pNew->nOut*(
272b0 31 20 2b 20 72 4c 6f 67 53 69 7a 65 29 3b 0a 20  1 + rLogSize);. 
272c0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54 42 44 3a     }.    /* TBD:
272d0 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 66 6f 72   Adjust nOut for
272e0 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73   additional cons
272f0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 72  traints */.    r
27300 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
27310 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
27320 65 77 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e  ew);.    if( (pN
27330 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
27340 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
27350 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e  0.     && pNew->
27360 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72  u.btree.nEq<=pPr
27370 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  obe->nColumn.   
27380 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 7a 4e 61    && pProbe->zNa
27390 6d 65 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  me!=0.    ){.   
273a0 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
273b0 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
273c0 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
273d0 2c 20 6e 49 6e 4d 75 6c 2a 6e 49 6e 29 3b 0a 20  , nInMul*nIn);. 
273e0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d     }.  }.  pNew-
273f0 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f  >prereq = saved_
27400 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e  prereq;.  pNew->
27410 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
27420 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d  ved_nEq;.  pNew-
27430 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
27440 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  _wsFlags;.  pNew
27450 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
27460 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  Out;.  pNew->nLT
27470 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
27480 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  rm;.  return rc;
27490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
274a0 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20 70   True if it is p
274b0 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e  ossible that pIn
274c0 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73 65  dex might be use
274d0 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d  ful in.** implem
274e0 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
274f0 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42   BY clause in pB
27500 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  uilder..**.** Re
27510 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42  turn False if pB
27520 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20  uilder does not 
27530 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52  contain an ORDER
27540 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a   BY clause or.**
27550 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
27560 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74  way for pIndex t
27570 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69  o be useful in i
27580 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74  mplementing that
27590 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
275a0 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
275b0 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c  nt indexMightHel
275c0 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20  pWithOrderBy(.  
275d0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
275e0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e   *pBuilder,.  In
275f0 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69  dex *pIndex,.  i
27600 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20  nt iCursor.){.  
27610 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20  ExprList *pOB;. 
27620 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74   int iCol;.  int
27630 20 69 69 3b 0a 0a 20 20 69 66 28 20 28 70 4f 42   ii;..  if( (pOB
27640 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
27650 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d  nfo->pOrderBy)==
27660 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
27670 69 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 61  iCol = pIndex->a
27680 69 43 6f 6c 75 6d 6e 5b 30 5d 3b 0a 20 20 66 6f  iColumn[0];.  fo
27690 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
276a0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
276b0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
276c0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
276d0 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
276e0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
276f0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27700 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
27710 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  0;.    if( pExpr
27720 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f  ->iTable==iCurso
27730 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r ){.      if( p
27740 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69  Expr->iColumn==i
27750 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Col ) return 1;.
27760 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
27770 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
27780 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
27790 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
277a0 20 6f 62 6a 65 63 74 73 20 61 20 73 69 6e 67 6c   objects a singl
277b0 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
277c0 6f 69 6e 20 77 65 72 65 20 74 68 65 20 74 61 62  oin were the tab
277d0 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65  le.** is idenfie
277e0 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
277f0 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
27800 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
27810 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  teed to be.** a 
27820 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f  b-tree table, no
27830 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
27840 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27850 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
27860 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ee(.  WhereLoopB
27870 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
27880 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  , /* WHERE claus
27890 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
278a0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
278b0 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a              /
278c0 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
278d0 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
278e0 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
278f0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
27900 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
27910 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
27920 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
27930 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
27940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
27950 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
27960 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
27970 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
27980 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
27990 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
279a0 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
279b0 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  key */.  tRowcnt
279c0 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
279d0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
279e0 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  wEst[] value for
279f0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
27a00 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e  /.  int aiColumn
27a10 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
27a20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
27a30 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
27a40 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72  Pk index */.  Sr
27a50 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
27a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27a70 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
27a80 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27a90 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a  _item *pSrc;  /*
27aa0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
27ab0 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61   btree term to a
27ac0 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  dd */.  WhereLoo
27ad0 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
27ae0 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
27af0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
27b00 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
27b10 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
27b20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
27b30 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49   */.  int iSortI
27b40 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  dx = 1;         
27b50 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
27b60 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20  r */.  int b;   
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b80 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20     /* A boolean 
27b90 76 61 6c 75 65 20 2a 2f 0a 20 20 57 68 65 72 65  value */.  Where
27ba0 43 6f 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  Cost rSize;     
27bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
27bc0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
27bd0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
27be0 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65  ereCost rLogSize
27bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
27c00 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
27c10 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
27c20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
27c30 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69    .  pNew = pBui
27c40 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57  lder->pNew;.  pW
27c50 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
27c60 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c  >pWInfo;.  pTabL
27c70 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
27c80 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d  abList;.  pSrc =
27c90 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70   pTabList->a + p
27ca0 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 61 73 73  New->iTab;.  ass
27cb0 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
27cc0 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
27cd0 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
27ce0 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
27cf0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
27d00 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
27d10 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
27d20 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72  o use */.    pPr
27d30 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
27d40 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
27d50 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
27d60 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
27d70 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
27d80 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
27d90 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
27da0 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
27db0 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
27dc0 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
27dd0 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
27de0 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
27df0 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
27e00 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
27e10 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
27e20 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
27e30 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
27e40 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
27e50 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27e70 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
27e80 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
27e90 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
27ea0 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
27eb0 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
27ec0 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
27ed0 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
27ee0 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
27ef0 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74      sPk.aiRowEst
27f00 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20   = aiRowEstPk;. 
27f10 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d     sPk.onError =
27f20 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
27f30 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53   sPk.pTable = pS
27f40 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69  rc->pTab;.    ai
27f50 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53  RowEstPk[0] = pS
27f60 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  rc->pTab->nRowEs
27f70 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
27f80 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46  k[1] = 1;.    pF
27f90 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
27fa0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
27fb0 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
27fc0 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
27fd0 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
27fe0 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
27ff0 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
28000 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
28010 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
28020 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
28030 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
28040 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
28050 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
28060 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
28070 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
28080 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 28  .  }.  rSize = (
28090 57 68 65 72 65 43 6f 73 74 29 70 53 72 63 2d 3e  WhereCost)pSrc->
280a0 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20  pTab->nRowEst;. 
280b0 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
280c0 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  og(rSize);..  /*
280d0 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   Automatic index
280e0 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75  es */.  if( !pBu
280f0 69 6c 64 65 72 2d 3e 70 42 65 73 74 0a 20 20 20  ilder->pBest.   
28100 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
28110 63 3e 31 0a 20 20 20 26 26 20 28 70 57 49 6e 66  c>1.   && (pWInf
28120 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
28130 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
28140 74 6f 49 6e 64 65 78 29 21 3d 30 20 0a 20 20 20  toIndex)!=0 .   
28150 26 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72  && !pSrc->viaCor
28160 6f 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53  outine.   && !pS
28170 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20  rc->notIndexed. 
28180 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f    && !pSrc->isCo
28190 72 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20  rrelated.  ){.  
281a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75    /* Generate au
281b0 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f  to-index WhereLo
281c0 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ops */.    Where
281d0 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42  Clause *pWC = pB
281e0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 20  uilder->pWC;.   
281f0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
28200 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  m;.    WhereTerm
28210 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e   *pWCEnd = pWC->
28220 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
28230 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
28240 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45  C->a; rc==SQLITE
28250 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43  _OK && pTerm<pWC
28260 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
28270 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
28280 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
28290 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
282a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
282b0 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
282c0 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
282d0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
282e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
282f0 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  q = 1;.        p
28300 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
28310 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
28320 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
28330 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
28340 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
28350 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  rm;.        pNew
28360 2d 3e 72 53 65 74 75 70 20 3d 20 32 30 2a 72 4c  ->rSetup = 20*rL
28370 6f 67 53 69 7a 65 2a 70 53 72 63 2d 3e 70 54 61  ogSize*pSrc->pTa
28380 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20  b->nRowEst;.    
28390 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
283a0 20 28 57 68 65 72 65 43 6f 73 74 29 31 30 3b 0a   (WhereCost)10;.
283b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
283c0 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20  un = rLogSize + 
283d0 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  pNew->nOut;.    
283e0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
283f0 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s = WHERE_TEMP_I
28400 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e  NDEX;.        pN
28410 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
28420 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  tra | pTerm->pre
28430 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
28440 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
28450 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
28460 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
28470 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
28480 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
28490 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  dices.  */.  for
284a0 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
284b0 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f   && pProbe; pPro
284c0 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74  be=pProbe->pNext
284d0 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20  , iSortIdx++){. 
284e0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
284f0 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e  .nEq = 0;.    pN
28500 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
28510 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
28520 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
28530 2d 3e 72 53 65 74 75 70 20 3d 20 28 57 68 65 72  ->rSetup = (Wher
28540 65 43 6f 73 74 29 30 3b 0a 20 20 20 20 70 4e 65  eCost)0;.    pNe
28550 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
28560 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ra;.    pNew->u.
28570 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
28580 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
28590 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
285a0 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
285b0 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
285c0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  >iCursor);.    i
285d0 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
285e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
285f0 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
28600 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
28610 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28620 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
28630 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
28640 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
28650 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
28660 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
28670 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  0;.      pNew->n
28680 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
28690 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
286a0 28 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a  (rSize + rLogSiz
286b0 65 29 2a 28 33 2b 62 29 3b 20 2f 2a 20 34 78 20  e)*(3+b); /* 4x 
286c0 70 65 6e 61 6c 74 79 20 66 6f 72 20 61 20 66 75  penalty for a fu
286d0 6c 6c 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  ll-scan */.     
286e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
286f0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
28700 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
28710 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
28720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
28730 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
28740 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69  colUsed;.      i
28750 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
28760 6a 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  j=pProbe->nColum
28770 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  n-1; j>=0; j--){
28780 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
28790 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
287a0 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  n[j];.        if
287b0 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20  ( x<BMS-1 ){.   
287c0 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 4d 41 53         m &= ~MAS
287d0 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 20 20 20  KBIT(x);.       
287e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
287f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
28800 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45   (m==0) ? (WHERE
28810 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
28820 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45  INDEXED) : WHERE
28830 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20 20  _INDEXED;..     
28840 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69   /* Full scan vi
28850 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  a index */.     
28860 20 69 66 28 20 28 6d 3d 3d 30 20 7c 7c 20 62 29   if( (m==0 || b)
28870 0a 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62  .       && pProb
28880 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  e->bUnordered==0
28890 0a 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e  .       && (pWIn
288a0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
288b0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
288c0 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20  ESIRED)==0.     
288d0 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62    && sqlite3Glob
288e0 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
288f0 0a 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d  .       && Optim
28900 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
28910 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
28920 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
28930 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 29 7b  dxScan).      ){
28940 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
28950 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
28960 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20  ortIdx : 0;.    
28970 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
28980 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
28990 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 28 6d 3d  pNew->rRun = (m=
289a0 3d 30 29 20 3f 20 28 72 53 69 7a 65 20 2b 20 72  =0) ? (rSize + r
289b0 4c 6f 67 53 69 7a 65 29 2a 28 31 2b 62 29 20 3a  LogSize)*(1+b) :
289c0 20 28 72 53 69 7a 65 2a 72 4c 6f 67 53 69 7a 65   (rSize*rLogSize
289d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
289e0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
289f0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
28a00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
28a10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
28a20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
28a30 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
28a40 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
28a50 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 31   pSrc, pProbe, 1
28a60 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
28a70 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
28a80 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
28a90 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
28aa0 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
28ab0 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
28ac0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
28ad0 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20  ndex ) break;.  
28ae0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28af0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
28b00 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
28b10 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66  s for a table of
28b20 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69   the join identi
28b30 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c  fied by.** pBuil
28b40 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
28b50 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
28b60 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
28b70 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
28b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28b90 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
28ba0 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ual(.  WhereLoop
28bb0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
28bc0 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  r,  /* WHERE cla
28bd0 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
28be0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
28bf0 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
28c00 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
28c10 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
28c20 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
28c30 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
28c40 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
28c50 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
28c60 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
28c70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28c90 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
28ca0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
28cb0 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
28cc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
28cd0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
28ce0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28cf0 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a  item *pSrc;   /*
28d00 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
28d10 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
28d20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
28d30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
28d40 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
28d50 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
28d60 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
28d70 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
28d80 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
28d90 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
28da0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
28db0 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
28dc0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
28dd0 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
28de0 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65   int iTerm, mxTe
28df0 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74  rm;.  int nConst
28e00 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65  raint;.  int see
28e10 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nIn = 0;        
28e20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
28e30 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
28e40 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
28e50 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20   seenVar = 0;   
28e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28e70 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74  e if a non-const
28e80 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  ant constraint i
28e90 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
28ea0 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20 20  iPhase;         
28eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63           /* 0: c
28ec0 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20  onst w/o IN, 1: 
28ed0 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c  const, 2: no IN,
28ee0 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65    2: IN */.  Whe
28ef0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
28f00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28f10 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20  OK;..  pWInfo = 
28f20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
28f30 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ;.  pParse = pWI
28f40 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
28f50 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
28f60 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
28f70 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20  ->pWC;.  pNew = 
28f80 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
28f90 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f    pSrc = &pWInfo
28fa0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e  ->pTabList->a[pN
28fb0 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61  ew->iTab];.  pTa
28fc0 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
28fd0 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74    assert( IsVirt
28fe0 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70  ual(pTab) );.  p
28ff0 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61  IdxInfo = alloca
29000 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
29010 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70  se, pWC, pSrc, p
29020 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42  Builder->pOrderB
29030 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  y);.  if( pIdxIn
29040 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  fo==0 ) return S
29050 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70  QLITE_NOMEM;.  p
29060 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b  New->prereq = 0;
29070 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
29080 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  = 0;.  pNew->wsF
29090 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52  lags = WHERE_VIR
290a0 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65  TUALTABLE;.  pNe
290b0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
290c0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
290d0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55  edFree = 0;.  pU
290e0 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
290f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
29100 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  e;.  nConstraint
29110 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   = pIdxInfo->nCo
29120 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20  nstraint;.  if( 
29130 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
29140 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
29150 72 61 69 6e 74 29 20 29 20 72 65 74 75 72 6e 20  raint) ) return 
29160 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
29170 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69   for(iPhase=0; i
29180 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65  Phase<=3; iPhase
29190 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65  ++){.    if( !se
291a0 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26  enIn && (iPhase&
291b0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  1)!=0 ){.      i
291c0 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Phase++;.      i
291d0 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72  f( iPhase>3 ) br
291e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
291f0 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69  f( !seenVar && i
29200 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b  Phase>1 ) break;
29210 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
29220 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
29230 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
29240 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
29250 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
29260 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
29270 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
29280 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
29290 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49  +){.      j = pI
292a0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
292b0 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  set;.      pTerm
292c0 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
292d0 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68       switch( iPh
292e0 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ase ){.        c
292f0 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 0:    /* Con
29300 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49  stants without I
29310 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
29320 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
29330 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
29340 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
29350 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
29360 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
29370 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20           seenIn 
29380 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
29390 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
293a0 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29  prereqRight!=0 )
293b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
293c0 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20  enVar = 1;.     
293d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
293e0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
293f0 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
29400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29410 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29420 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a     case 1:    /*
29430 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   Constants with 
29440 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
29450 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29460 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  ( seenIn );.    
29470 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
29480 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
29490 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29  >prereqRight==0)
294a0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
294b0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
294c0 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
294d0 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
294e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
294f0 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
29500 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
29510 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
29520 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
29530 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
29540 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29550 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
29560 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
29570 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
29580 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
29590 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
295a0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
295b0 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
295c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
295d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
295e0 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
295f0 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
29600 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
29610 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
29620 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
29630 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
29640 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
29650 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
29660 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
29670 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
29680 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
29690 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
296a0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
296b0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
296c0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
296d0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
296e0 2f 2a 20 28 28 57 68 65 72 65 43 6f 73 74 29 32  /* ((WhereCost)2
296f0 29 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c  ) In case of SQL
29700 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
29710 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20  G_POINT... */.  
29720 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
29730 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49  matedCost = SQLI
29740 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28 57  TE_BIG_DBL / ((W
29750 68 65 72 65 43 6f 73 74 29 32 29 3b 0a 20 20 20  hereCost)2);.   
29760 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e   rc = vtabBestIn
29770 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62  dex(pParse, pTab
29780 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20  , pIdxInfo);.   
29790 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
297a0 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
297b0 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f  exit;.    pIdxCo
297c0 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
297d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
297e0 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
297f0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
29800 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
29810 71 20 3d 20 30 3b 0a 20 20 20 20 6d 78 54 65 72  q = 0;.    mxTer
29820 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  m = -1;.    asse
29830 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rt( pNew->nLSlot
29840 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b  >=nConstraint );
29850 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
29860 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
29870 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ) pNew->aLTerm[i
29880 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  ] = 0;.    pNew-
29890 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
298a0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
298b0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
298c0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
298d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69  +){.      if( (i
298e0 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d  Term = pUsage[i]
298f0 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e  .argvIndex - 1)>
29900 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  =0 ){.        j 
29910 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
29920 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
29930 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e   if( iTerm>=nCon
29940 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20  straint.        
29950 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20   || j<0.        
29960 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72   || j>=pWC->nTer
29970 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e  m.         || pN
29980 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
29990 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  ]!=0.        ){.
299a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
299b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
299c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
299d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
299e0 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20  %s.xBestIndex() 
299f0 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54  malfunction", pT
29a00 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
29a10 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
29a20 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
29a30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29a40 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
29a50 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[j];.        
29a60 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
29a70 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
29a80 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
29a90 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e  rt( iTerm<pNew->
29aa0 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
29ab0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
29ac0 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
29ad0 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
29ae0 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
29af0 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
29b00 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26    if( iTerm<16 &
29b10 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  & pUsage[i].omit
29b20 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e   ) pNew->u.vtab.
29b30 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  omitMask |= 1<<i
29b40 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
29b50 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
29b60 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
29b70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
29b80 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d   pUsage[i].omit=
29b90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29ba0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    /* Do not atte
29bb0 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e  mpt to use an IN
29bc0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74   constraint if t
29bd0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
29be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
29bf0 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71  says that the eq
29c00 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73  uivalent EQ cons
29c10 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
29c20 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e   safely omitted.
29c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
29c40 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74  If we do attempt
29c50 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63   to use such a c
29c60 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20  onstraint, some 
29c70 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20  rows might be.  
29c80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70            ** rep
29c90 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74  eated in the out
29ca0 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  put. */.        
29cb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
29cd0 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61   /* A virtual ta
29ce0 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  ble that is cons
29cf0 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e  trained by an IN
29d00 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a   clause may not.
29d10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
29d20 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42  sume the ORDER B
29d30 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65  Y clause because
29d40 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f   (1) the order o
29d50 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20  f IN terms.     
29d60 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e       ** is not n
29d70 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74  ecessarily relat
29d80 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20  ed to the order 
29d90 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20  of output terms 
29da0 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
29db0 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
29dc0 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
29dd0 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
29de0 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
29df0 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65        ** togethe
29e00 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  r.  */.         
29e10 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
29e20 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
29e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29e40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
29e50 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  i>=nConstraint )
29e60 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  {.      pNew->nL
29e70 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
29e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29e90 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65  New->nLTerm<=pNe
29ea0 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
29eb0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
29ec0 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66  idxNum = pIdxInf
29ed0 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20  o->idxNum;.     
29ee0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
29ef0 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66  edFree = pIdxInf
29f00 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
29f10 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49  Str;.      pIdxI
29f20 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
29f30 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  dxStr = 0;.     
29f40 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
29f50 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xStr = pIdxInfo-
29f60 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  >idxStr;.      p
29f70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72  New->u.vtab.isOr
29f80 64 65 72 65 64 20 3d 20 28 75 38 29 28 28 70 49  dered = (u8)((pI
29f90 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
29fa0 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  !=0).           
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fc0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
29fd0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
29fe0 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70  nsumed);.      p
29ff0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 28 57  New->rSetup = (W
2a000 68 65 72 65 43 6f 73 74 29 30 3b 0a 20 20 20 20  hereCost)0;.    
2a010 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 70    pNew->rRun = p
2a020 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
2a030 65 64 43 6f 73 74 3b 0a 20 20 20 20 20 20 70 4e  edCost;.      pN
2a040 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65 72  ew->nOut = (Wher
2a050 65 43 6f 73 74 29 32 35 3b 0a 20 20 20 20 20 20  eCost)25;.      
2a060 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2a070 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2a080 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
2a090 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2a0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2a0b0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75  te3_free(pNew->u
2a0c0 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
2a0d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76         pNew->u.v
2a0e0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
2a0f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a100 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70    }  ..whereLoop
2a110 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20 20  AddVtab_exit:.  
2a120 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
2a130 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
2a140 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
2a150 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
2a160 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2a170 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
2a180 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a190 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c  /*.** Add WhereL
2a1a0 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68  oop entries to h
2a1b0 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20  andle OR terms. 
2a1c0 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20   This works for 
2a1d0 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73  either.** btrees
2a1e0 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c   or virtual tabl
2a1f0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2a200 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  t whereLoopAddOr
2a210 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2a220 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74  r *pBuilder, Bit
2a230 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20  mask mExtra){.  
2a240 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2a250 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2a260 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61  Info;.  WhereCla
2a270 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
2a280 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57  eLoop *pNew;.  W
2a290 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
2a2a0 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20   *pWCEnd;.  int 
2a2b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a2c0 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68    int iCur;.  Wh
2a2d0 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
2a2e0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  ;.  WhereLoopBui
2a2f0 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a  lder sSubBuild;.
2a300 20 20 57 68 65 72 65 4c 6f 6f 70 20 73 42 65 73    WhereLoop sBes
2a310 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
2a320 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2a330 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
2a340 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
2a350 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2a360 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
2a370 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51  ONLY ) return SQ
2a380 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e  LITE_OK;.  pWCEn
2a390 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2a3a0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
2a3b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2a3c0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
2a3d0 74 28 26 73 42 65 73 74 29 3b 0a 0a 20 20 66 6f  t(&sBest);..  fo
2a3e0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
2a3f0 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20  pTerm<pWCEnd && 
2a400 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
2a410 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
2a420 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2a430 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20  or & WO_OR)!=0. 
2a440 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
2a450 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
2a460 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ble & pNew->mask
2a470 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b  Self)!=0 .    ){
2a480 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
2a490 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  se * const pOrWC
2a4a0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
2a4b0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
2a4c0 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
2a4d0 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f  t pOrWCEnd = &pO
2a4e0 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54  rWC->a[pOrWC->nT
2a4f0 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72  erm];.      Wher
2a500 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a  eTerm *pOrTerm;.
2a510 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20        WhereCost 
2a520 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  rTotal = 0;.    
2a530 20 20 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77    WhereCost nRow
2a540 20 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74 6d   = 0;.      Bitm
2a550 61 73 6b 20 70 72 65 72 65 71 20 3d 20 6d 45 78  ask prereq = mEx
2a560 74 72 61 3b 0a 20 20 20 20 0a 20 20 20 20 20 20  tra;.    .      
2a570 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
2a580 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
2a590 65 77 2d 3e 69 54 61 62 3b 0a 20 20 20 20 20 20  ew->iTab;.      
2a5a0 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
2a5b0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 53 75  ursor;.      sSu
2a5c0 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
2a5d0 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
2a5e0 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
2a5f0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
2a600 64 2e 70 42 65 73 74 20 3d 20 26 73 42 65 73 74  d.pBest = &sBest
2a610 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  ;..      for(pOr
2a620 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
2a630 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
2a640 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
2a650 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
2a660 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2a670 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
2a680 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
2a690 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d  .pWC = &pOrTerm-
2a6a0 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  >u.pAndInfo->wc;
2a6b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2a6c0 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
2a6d0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
2a6e0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2a6f0 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  .pWInfo = pWC->p
2a700 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  WInfo;.         
2a710 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d   tempWC.pOuter =
2a720 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pWC;.          
2a730 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
2a740 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ND;.          te
2a750 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
2a760 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2a770 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
2a780 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
2a790 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  d.pWC = &tempWC;
2a7a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2a7b0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2a7c0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
2a7d0 20 20 20 20 20 20 73 42 65 73 74 2e 6d 61 73 6b        sBest.mask
2a7e0 53 65 6c 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Self = 0;.      
2a7f0 20 20 73 42 65 73 74 2e 72 53 65 74 75 70 20 3d    sBest.rSetup =
2a800 20 30 3b 0a 20 20 20 20 20 20 20 20 73 42 65 73   0;.        sBes
2a810 74 2e 72 52 75 6e 20 3d 20 30 3b 0a 20 20 20 20  t.rRun = 0;.    
2a820 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
2a830 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
2a840 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2a850 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
2a860 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c  tual(&sSubBuild,
2a870 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   mExtra);.      
2a880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a890 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2a8a0 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42  pAddBtree(&sSubB
2a8b0 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
2a8c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a8d0 20 69 66 28 20 73 42 65 73 74 2e 6d 61 73 6b 53   if( sBest.maskS
2a8e0 65 6c 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  elf==0 ) break;.
2a8f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a900 73 42 65 73 74 2e 72 53 65 74 75 70 3d 3d 28 57  sBest.rSetup==(W
2a910 68 65 72 65 43 6f 73 74 29 30 20 29 3b 0a 20 20  hereCost)0 );.  
2a920 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20        rTotal += 
2a930 73 42 65 73 74 2e 72 52 75 6e 3b 0a 20 20 20 20  sBest.rRun;.    
2a940 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73 42 65 73      nRow += sBes
2a950 74 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  t.nOut;.        
2a960 70 72 65 72 65 71 20 7c 3d 20 73 42 65 73 74 2e  prereq |= sBest.
2a970 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 7d 0a  prereq;.      }.
2a980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
2a990 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 31 20 29 3b  ew->nLSlot>=1 );
2a9a0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
2a9b0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  erm = 1;.      p
2a9c0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
2a9d0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e   pTerm;.      pN
2a9e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
2a9f0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
2aa00 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
2aa10 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29 30 3b   = (WhereCost)0;
2aa20 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
2aa30 6e 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20  n = rTotal;.    
2aa40 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
2aa50 52 6f 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Row;.      pNew-
2aa60 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65 71  >prereq = prereq
2aa70 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
2aa80 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  pNew->u, 0, size
2aa90 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20  of(pNew->u));.  
2aaa0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2aab0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2aac0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a  r, pNew);.    }.
2aad0 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43    }.  whereLoopC
2aae0 6c 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lear(pWInfo->pPa
2aaf0 72 73 65 2d 3e 64 62 2c 20 26 73 42 65 73 74 29  rse->db, &sBest)
2ab00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2ab10 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
2ab20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2ab30 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
2ab40 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
2ab50 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
2ab60 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2ab70 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
2ab80 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2ab90 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2aba0 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  nfo;.  Bitmask m
2abb0 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74  Extra = 0;.  Bit
2abc0 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b  mask mPrior = 0;
2abd0 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53  .  int iTab;.  S
2abe0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2abf0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2ac00 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
2ac10 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2ac20 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
2ac30 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2ac40 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54 61  e->db;.  int nTa
2ac50 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2ac60 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63  nLevel;.  int rc
2ac70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2ac80 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
2ac90 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
2aca0 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
2acb0 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65  he join, from le
2acc0 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20  ft to right */. 
2acd0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 20   pBuilder->pNew 
2ace0 3d 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  = pNew = sqlite3
2acf0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
2ad00 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
2ad10 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  p));.  if( pNew=
2ad20 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2ad30 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77  TE_NOMEM;.  pNew
2ad40 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  ->aLTerm = pNew-
2ad50 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20  >aLTermSpace;.  
2ad60 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  pNew->nLSlot = A
2ad70 72 72 61 79 53 69 7a 65 28 70 4e 65 77 2d 3e 61  rraySize(pNew->a
2ad80 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 66  LTermSpace);.  f
2ad90 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d  or(iTab=0, pItem
2ada0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54  =pTabList->a; iT
2adb0 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61  ab<nTabList; iTa
2adc0 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  b++, pItem++){. 
2add0 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20     pNew->iTab = 
2ade0 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  iTab;.    pNew->
2adf0 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61  maskSelf = getMa
2ae00 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
2ae10 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
2ae20 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
2ae30 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  pItem->jointype 
2ae40 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
2ae50 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  OSS))!=0 ){.    
2ae60 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f    mExtra = mPrio
2ae70 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
2ae80 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
2ae90 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
2aea0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2aeb0 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
2aec0 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
2aed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2aee0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
2aef0 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  tree(pBuilder, m
2af00 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
2af10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2af20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2af30 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
2af40 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
2af50 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50  a);.    }.    mP
2af60 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61  rior |= pNew->ma
2af70 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20  skSelf;.    if( 
2af80 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
2af90 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
2afa0 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 44    }.  whereLoopD
2afb0 65 6c 65 74 65 28 64 62 2c 20 70 42 75 69 6c 64  elete(db, pBuild
2afc0 65 72 2d 3e 70 4e 65 77 29 3b 0a 20 20 70 42 75  er->pNew);.  pBu
2afd0 69 6c 64 65 72 2d 3e 70 4e 65 77 20 3d 20 30 3b  ilder->pNew = 0;
2afe0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2aff0 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61  ./*.** Examine a
2b000 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74 68   WherePath (with
2b010 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
2b020 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72 65   the extra Where
2b030 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a  Loop of the 5th.
2b040 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20 74  ** parameters) t
2b050 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74 70  o see if it outp
2b060 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20  uts rows in the 
2b070 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52 20  requested ORDER 
2b080 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20  BY.** (or GROUP 
2b090 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71 75  BY) without requ
2b0a0 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74 65  iring a separate
2b0b0 20 73 6f 75 72 63 65 20 6f 70 65 72 61 74 69 6f   source operatio
2b0c0 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a  n.  Return:.** .
2b0d0 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44 45 52 20  **    0:  ORDER 
2b0e0 42 59 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66  BY is not satisf
2b0f0 69 65 64 2e 20 20 53 6f 72 74 69 6e 67 20 72 65  ied.  Sorting re
2b100 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20  quired.**    1: 
2b110 20 4f 52 44 45 52 20 42 59 20 69 73 20 73 61 74   ORDER BY is sat
2b120 69 73 66 69 65 64 2e 20 20 20 20 20 20 4f 6d 69  isfied.      Omi
2b130 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d  t sorting.**   -
2b140 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74  1:  Unknown at t
2b150 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2f 0a 73  his time.**.*/.s
2b160 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
2b170 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
2b180 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  rBy(.  WhereInfo
2b190 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20   *pWInfo,    /* 
2b1a0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2b1b0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2b1c0 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
2b1d0 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
2b1e0 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e  check */.  int n
2b1f0 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  Loop,           
2b200 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
2b210 74 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e  tries in pPath->
2b220 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aLoop[] */.  int
2b230 20 69 73 4c 61 73 74 4c 6f 6f 70 2c 20 20 20 20   isLastLoop,    
2b240 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 4c     /* True if pL
2b250 61 73 74 20 69 73 20 74 68 65 20 69 6e 6e 65 72  ast is the inner
2b260 2d 6d 6f 73 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  -most loop */.  
2b270 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
2b280 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69  ,     /* Add thi
2b290 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74  s WhereLoop to t
2b2a0 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d  he end of pPath-
2b2b0 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69  >aLoop[] */.  Bi
2b2c0 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20  tmask *pRevMask 
2b2d0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57      /* Mask of W
2b2e0 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e  hereLoops to run
2b2f0 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
2b300 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76  r */.){.  u8 rev
2b310 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Set;            
2b320 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69  /* True if rev i
2b330 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20  s known */.  u8 
2b340 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
2b350 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20     /* Composite 
2b360 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
2b370 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20  u8 revIdx;      
2b380 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
2b390 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
2b3a0 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  8 isOrderDistinc
2b3b0 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f  t;   /* All prio
2b3c0 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65  r WhereLoops are
2b3d0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
2b3e0 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74  */.  u8 distinct
2b3f0 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72  Columns;   /* Tr
2b400 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68  ue if the loop h
2b410 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55  as UNIQUE NOT NU
2b420 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
2b430 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20  u8 isMatch;     
2b440 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e        /* iColumn
2b450 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20   matches a term 
2b460 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
2b470 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
2b480 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  nColumn;        
2b490 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2b4a0 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78  olumns in pIndex
2b4b0 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
2b4c0 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
2b4d0 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
2b4e0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2b4f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
2b500 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
2b510 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
2b520 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
2b530 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
2b540 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2b550 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2b560 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2b570 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
2b580 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2b590 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
2b5a0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
2b5b0 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
2b5c0 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
2b5d0 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
2b5e0 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
2b5f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2b600 3b 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ;     /* Current
2b610 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
2b620 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
2b630 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2b640 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f  rBy = pWInfo->pO
2b650 72 64 65 72 42 79 3b 20 20 2f 2a 20 74 68 65 20  rderBy;  /* the 
2b660 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2b670 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
2b680 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20  pTerm;     /* A 
2b690 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
2b6a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2b6b0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78  */.  Expr *pOBEx
2b6c0 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  pr;        /* An
2b6d0 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
2b6e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2b6f0 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  ause */.  CollSe
2b700 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
2b710 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74  /* COLLATE funct
2b720 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45  ion from an ORDE
2b730 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
2b740 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
2b750 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  dex;        /* T
2b760 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  he index associa
2b770 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a  ted with pLoop *
2b780 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
2b790 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2b7a0 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
2b7b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
2b7c0 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74  .  Bitmask obSat
2b7d0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b   = 0;    /* Mask
2b7e0 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
2b7f0 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20  ms satisfied so 
2b800 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  far */.  Bitmask
2b810 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f   obDone;       /
2b820 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52  * Mask of all OR
2b830 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
2b840 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44    Bitmask orderD
2b850 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a  istinctMask;  /*
2b860 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c   Mask of all wel
2b870 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20  l-ordered loops 
2b880 2a 2f 0a 20 20 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  */.  ..  /*.  **
2b890 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
2b8a0 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f  eLoop is "one-ro
2b8b0 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74  w" if it generat
2b8c0 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  es no more than 
2b8d0 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  one.  ** row of 
2b8e0 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65  output.  A Where
2b8f0 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20  Loop is one-row 
2b900 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2b910 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2b920 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20  :.  **  (a) All 
2b930 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61  index columns ma
2b940 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43  tch with WHERE_C
2b950 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20  OLUMN_EQ..  **  
2b960 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73  (b) The index is
2b970 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79   unique.  ** Any
2b980 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
2b990 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  an WHERE_COLUMN_
2b9a0 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  EQ constraint on
2b9b0 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e   the rowid is on
2b9c0 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72  e-row..  ** Ever
2b9d0 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
2b9e0 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68  oop will have th
2b9f0 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62  e WHERE_ONEROW b
2ba00 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67  it set in wsFlag
2ba10 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  s..  **.  ** We 
2ba20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
2ba30 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74  p is "order-dist
2ba40 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74  inct" if the set
2ba50 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d   of columns from
2ba60 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65  .  ** that Where
2ba70 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e  Loop that are in
2ba80 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2ba90 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65  ause are differe
2baa0 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a  nt for every.  *
2bab0 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65  * row of the Whe
2bac0 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f  reLoop.  Every o
2bad0 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2bae0 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
2baf0 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73  y.  ** order-dis
2bb00 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65  tinct.   A Where
2bb10 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f  Loop that has no
2bb20 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2bb30 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
2bb40 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65    ** is not orde
2bb50 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62  r-distinct. To b
2bb60 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2bb70 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68   is not quite th
2bb80 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a  e same as being.
2bb90 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63    ** UNIQUE sinc
2bba0 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d  e a UNIQUE colum
2bbb0 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68  n or index can h
2bbc0 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ave multiple row
2bbd0 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65  s that .  ** are
2bbe0 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76   NULL and NULL v
2bbf0 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61  alues are equiva
2bc00 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  lent for the pur
2bc10 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69  pose of order-di
2bc20 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20  stinct..  ** To 
2bc30 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
2bc40 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d  t, the columns m
2bc50 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e  ust be UNIQUE an
2bc60 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  d NOT NULL..  **
2bc70 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  .  ** The rowid 
2bc80 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61  for a table is a
2bc90 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64  lways UNIQUE and
2bca0 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65   NOT NULL so whe
2bcb0 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72  never the.  ** r
2bcc0 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20  owid appears in 
2bcd0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2bce0 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  use, the corresp
2bcf0 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  onding WhereLoop
2bd00 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74   is.  ** automat
2bd10 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73  ically order-dis
2bd20 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61  tinct..  */..  a
2bd30 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
2bd40 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74  =0 );..  /* Sort
2bd50 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75  ability of virtu
2bd60 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65 74  al tables is det
2bd70 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78  ermined by the x
2bd80 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
2bd90 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72  .  ** of the vir
2bda0 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c  tual table itsel
2bdb0 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74  f */.  if( pLast
2bdc0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2bdd0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29  E_VIRTUALTABLE )
2bde0 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
2bdf0 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54  nLoop>0 );  /* T
2be00 72 75 65 20 77 68 65 6e 20 6f 75 74 65 72 20 6c  rue when outer l
2be10 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77  oops are one-row
2be20 20 61 6e 64 20 6d 61 74 63 68 20 0a 20 20 20 20   and match .    
2be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be40 20 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45        ** no ORDE
2be50 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
2be60 20 20 72 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e    return pLast->
2be70 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
2be80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f  ;.  }.  if( nLoo
2be90 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
2bea0 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
2beb0 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
2bec0 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
2bed0 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ..  nOrderBy = p
2bee0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
2bef0 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
2bf00 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
2bf10 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
2bf20 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
2bf30 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
2bf40 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2bf50 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
2bf60 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
2bf70 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
2bf80 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
2bf90 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73   for(iLoop=0; is
2bfa0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26  OrderDistinct &&
2bfb0 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26   obSat<obDone &&
2bfc0 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69   iLoop<=nLoop; i
2bfd0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 70 4c 6f  Loop++){.    pLo
2bfe0 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  op = iLoop<nLoop
2bff0 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   ? pPath->aLoop[
2c000 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a  iLoop] : pLast;.
2c010 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
2c020 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2c030 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2c040 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43 75 72  )==0 );.    iCur
2c050 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2c060 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
2c070 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20  ab].iCursor;.   
2c080 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2c090 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2c0a0 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ROW)==0 ){.     
2c0b0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2c0c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20  ags & WHERE_IPK 
2c0d0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
2c0e0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  x = 0;.        n
2c0f0 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20  Column = 0;.    
2c100 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e    }else if( (pIn
2c110 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
2c120 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20  tree.pIndex)==0 
2c130 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  || pIndex->bUnor
2c140 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
2c150 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2c160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c170 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  nColumn = pIndex
2c180 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
2c190 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2c1a0 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  ct = pIndex->onE
2c1b0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
2c1c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2c1d0 20 46 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   For every term 
2c1e0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  of the index tha
2c1f0 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
2c200 20 62 79 20 3d 3d 20 6f 72 20 49 53 20 4e 55 4c   by == or IS NUL
2c210 4c 2c 0a 20 20 20 20 20 20 2a 2a 20 6d 61 72 6b  L,.      ** mark
2c220 20 6f 66 66 20 63 6f 72 72 65 73 70 6f 6e 64 69   off correspondi
2c230 6e 67 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ng ORDER BY term
2c240 73 20 77 68 65 72 65 76 65 72 20 74 68 65 79 20  s wherever they 
2c250 6f 63 63 75 72 0a 20 20 20 20 20 20 2a 2a 20 69  occur.      ** i
2c260 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2c270 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  lause..      */.
2c280 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2c290 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
2c2a0 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nEq; i++){.     
2c2b0 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
2c2c0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20 20  ->aLTerm[i];.   
2c2d0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2c2e0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
2c2f0 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 3d  _EQ|WO_ISNULL))=
2c300 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2c310 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
2c320 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
2c330 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f  lumn;.        fo
2c340 72 28 6a 3d 30 3b 20 6a 3c 6e 4f 72 64 65 72 42  r(j=0; j<nOrderB
2c350 79 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; j++){.       
2c360 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 6a     if( MASKBIT(j
2c370 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
2c380 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2c390 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
2c3a0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
2c3b0 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a 5d 2e  (pOrderBy->a[j].
2c3c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2c3d0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
2c3e0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
2c3f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2c400 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2c410 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2c420 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2c430 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2c440 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
2c450 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c460 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
2c470 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2c480 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2c490 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2c4a0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2c4b0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a 5d 2e 70  pOrderBy->a[j].p
2c4c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2c4d0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2c4e0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2c4f0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
2c500 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2c510 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
2c520 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  me, pIndex->azCo
2c530 6c 6c 5b 69 5d 29 21 3d 30 20 29 20 63 6f 6e 74  ll[i])!=0 ) cont
2c540 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2c550 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  }.          obSa
2c560 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b  t |= MASKBIT(j);
2c570 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c580 20 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62     if( obSat==ob
2c590 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 31 3b  Done ) return 1;
2c5a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2c5b0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
2c5c0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
2c5d0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
2c5e0 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
2c5f0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
2c600 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
2c610 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
2c620 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
2c630 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
2c640 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
2c650 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
2c660 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f   for(j=0; j<=nCo
2c670 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
2c680 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20      u8 bOnce;   
2c690 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
2c6a0 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
2c6b0 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
2c6c0 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72      /* Skip over
2c6d0 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20   == and IS NULL 
2c6e0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20  terms */.       
2c6f0 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
2c700 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
2c710 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f     && ((i = pLoo
2c720 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
2c730 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45  perator) & (WO_E
2c740 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
2c750 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2c760 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
2c770 5f 49 53 4e 55 4c 4c 20 29 20 69 73 4f 72 64 65  _ISNULL ) isOrde
2c780 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
2c790 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2c7a0 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a  e;  .        }..
2c7b0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74          /* Get t
2c7c0 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
2c7d0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69   in the table (i
2c7e0 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74  Column) and sort
2c7f0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
2c800 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74  * (revIdx) for t
2c810 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he j-th column o
2c820 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  f the index..   
2c830 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c840 69 66 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b  if( j<nColumn ){
2c850 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
2c860 72 6d 61 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d  rmal index colum
2c870 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ns */.          
2c880 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
2c890 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
2c8a0 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
2c8b0 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  = pIndex->aSortO
2c8c0 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
2c8d0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
2c8e0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2c8f0 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20  iPKey ) iColumn 
2c900 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
2c910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2c920 2a 20 54 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  * The ROWID colu
2c930 6d 6e 20 61 74 20 74 68 65 20 65 6e 64 20 2a 2f  mn at the end */
2c940 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
2c950 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
2c960 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20     revIdx = 0;. 
2c970 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2c980 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72    /* An unconstr
2c990 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61  ained column tha
2c9a0 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
2c9b0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a  means that this.
2c9c0 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65          ** Where
2c9d0 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c  Loop is not well
2c9e0 2d 6f 72 64 65 72 65 64 20 0a 20 20 20 20 20 20  -ordered .      
2c9f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2ca00 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2ca10 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
2ca20 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
2ca30 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
2ca40 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
2ca50 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
2ca60 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
2ca70 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
2ca80 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2ca90 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2caa0 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
2cab0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
2cac0 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
2cad0 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
2cae0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
2caf0 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
2cb00 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
2cb10 78 20 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74  x and and mark t
2cb20 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72  hat ORDER BY ter
2cb30 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a  m off .        *
2cb40 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20  /.        bOnce 
2cb50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d  = 1;.        isM
2cb60 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
2cb70 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65    for(i=0; bOnce
2cb80 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20   && i<nOrderBy; 
2cb90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2cba0 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
2cbb0 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
2cbc0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42  e;.          pOB
2cbd0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
2cbe0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
2cbf0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2cc00 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
2cc10 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
2cc20 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
2cc30 52 4f 55 50 42 59 29 3d 3d 30 20 29 20 62 4f 6e  ROUPBY)==0 ) bOn
2cc40 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
2cc50 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
2cc60 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
2cc70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2cc80 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2cc90 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2cca0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2ccb0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2ccc0 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
2ccd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2cce0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
2ccf0 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2cd00 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2cd10 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2cd20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2cd30 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2cd40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2cd50 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2cd60 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2cd70 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
2cd80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2cd90 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
2cda0 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  me, pIndex->azCo
2cdb0 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74  ll[j])!=0 ) cont
2cdc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2cdd0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61  }.          isMa
2cde0 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
2cdf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2ce00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2ce10 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
2ce20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2ce30 3c 30 20 29 20 64 69 73 74 69 6e 63 74 43 6f 6c  <0 ) distinctCol
2ce40 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  umns = 1;.      
2ce50 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
2ce60 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
2ce70 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
2ce80 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2ce90 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29  RE_GROUPBY)==0 )
2cea0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2ceb0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
2cec0 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
2ced0 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
2cee0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
2cef0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f             ** So
2cf00 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
2cf10 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
2cf20 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
2cf30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2cf40 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
2cf50 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
2cf60 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72  v ^ revIdx)!=pOr
2cf70 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
2cf80 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 30  Order ) return 0
2cf90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
2cfa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2cfb0 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20     rev = revIdx 
2cfc0 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ^ pOrderBy->a[i]
2cfd0 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
2cfe0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
2cff0 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d  v ) *pRevMask |=
2d000 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b   MASKBIT(iLoop);
2d010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2d020 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
2d030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2d050 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2d060 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20   No match found 
2d070 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2d080 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75   j==0 || j<nColu
2d090 6d 6e 20 29 20 69 73 4f 72 64 65 72 44 69 73 74  mn ) isOrderDist
2d0a0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
2d0b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2d0c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
2d0d0 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c  end Loop over al
2d0e0 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
2d0f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73  */.      if( dis
2d100 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 20 69  tinctColumns ) i
2d110 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2d120 20 31 3b 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64   1;.    } /* end
2d130 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20  -if not one-row 
2d140 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  */..    /* Mark 
2d150 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52  off any other OR
2d160 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
2d170 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f  t reference pLoo
2d180 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f  p */.    if( isO
2d190 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
2d1a0 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69        orderDisti
2d1b0 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70  nctMask |= pLoop
2d1c0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2d1d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
2d1e0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2d1f0 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20       Expr *p;.  
2d200 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
2d210 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
2d220 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2d230 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
2d240 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
2d250 20 20 20 69 66 28 20 28 65 78 70 72 54 61 62 6c     if( (exprTabl
2d260 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e  eUsage(&pWInfo->
2d270 73 4d 61 73 6b 53 65 74 2c 20 70 29 26 7e 6f 72  sMaskSet, p)&~or
2d280 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29  derDistinctMask)
2d290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2d2a0 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
2d2b0 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T(i);.        }.
2d2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d2d0 7d 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f  }.  if( obSat==o
2d2e0 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 31  bDone ) return 1
2d2f0 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65 72  ;.  if( !isOrder
2d300 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
2d310 6e 20 30 3b 0a 20 20 69 66 28 20 69 73 4c 61 73  n 0;.  if( isLas
2d320 74 4c 6f 6f 70 20 29 20 72 65 74 75 72 6e 20 31  tLoop ) return 1
2d330 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ;.  return -1;.}
2d340 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
2d350 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
2d360 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
2d370 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
2d380 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
2d390 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
2d3a0 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
2d3b0 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
2d3c0 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
2d3d0 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
2d3e0 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
2d3f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
2d400 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
2d410 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
2d420 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
2d430 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
2d440 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
2d450 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
2d460 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
2d470 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2d480 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
2d490 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
2d4a0 6a 65 63 74 73 20 6f 6e 20 70 57 49 6e 66 6f 2d  jects on pWInfo-
2d4b0 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
2d4c0 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
2d4d0 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
2d4e0 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
2d4f0 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
2d500 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
2d510 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
2d520 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
2d530 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
2d540 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
2d550 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
2d560 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
2d570 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ss or SQLITE_NOM
2d580 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM of a memory a
2d590 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72  llocation.** err
2d5a0 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
2d5b0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
2d5c0 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e  thSolver(WhereIn
2d5d0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 57 68 65 72  fo *pWInfo, Wher
2d5e0 65 43 6f 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a  eCost nRowEst){.
2d5f0 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20    int mxChoice; 
2d600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2d610 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2d620 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61   simultaneous pa
2d630 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20  ths tracked */. 
2d640 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20   int nLoop;     
2d650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2d660 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
2d670 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 73   the join */.  s
2d680 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2d690 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d6a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2d6b0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ion */.  int iLo
2d6c0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
2d6d0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2d6e0 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d  er over the term
2d6f0 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
2d700 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20  .  int ii, jj;  
2d710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d720 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2d730 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 43 6f  .  WhereCost rCo
2d740 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
2d750 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61 74  /* Cost of a pat
2d760 68 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  h */.  WhereCost
2d770 20 6d 78 43 6f 73 74 3b 20 20 20 20 20 20 20 20   mxCost;        
2d780 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
2d790 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
2d7a0 70 61 74 68 73 20 2a 2f 0a 20 20 57 68 65 72 65  paths */.  Where
2d7b0 43 6f 73 74 20 72 53 6f 72 74 43 6f 73 74 3b 20  Cost rSortCost; 
2d7c0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
2d7d0 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a  to do a sort */.
2d7e0 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
2d7f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2d800 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
2d810 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
2d820 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
2d830 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
2d840 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
2d850 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
2d860 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
2d870 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
2d880 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
2d890 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
2d8a0 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
2d8b0 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
2d8c0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
2d8d0 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
2d8e0 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
2d8f0 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
2d900 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
2d910 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
2d920 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
2d930 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
2d940 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
2d950 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
2d960 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
2d970 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
2d980 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2d990 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
2d9a0 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
2d9b0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2d9c0 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
2d9d0 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
2d9e0 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20    char *pSpace; 
2d9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2da00 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
2da10 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  used by this rou
2da20 74 69 6e 65 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  tine */..  db = 
2da30 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2da40 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57  db;.  nLoop = pW
2da50 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
2da60 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
2da70 70 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p==1) ? 1 : (nLo
2da80 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
2da90 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
2daa0 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
2dab0 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 23 69 66 64  st->nSrc );.#ifd
2dac0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2dad0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2dae0 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32  te3WhereTrace>=2
2daf0 20 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50   ) sqlite3DebugP
2db00 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 62 65 67 69  rintf("---- begi
2db10 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 3b 0a 23 65  n solver\n");.#e
2db20 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ndif..  /* Alloc
2db30 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2db40 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f  ze space for aTo
2db50 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20   and aFrom */.  
2db60 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65  ii = (sizeof(Whe
2db70 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57  rePath)+sizeof(W
2db80 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70  hereLoop*)*nLoop
2db90 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20  )*mxChoice*2;.  
2dba0 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
2dbb0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
2dbc0 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63  ii);.  if( pSpac
2dbd0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
2dbe0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54  LITE_NOMEM;.  aT
2dbf0 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
2dc00 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
2dc10 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
2dc20 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
2dc30 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
2dc40 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
2dc50 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
2dc60 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
2dc70 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
2dc80 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
2dc90 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
2dca0 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
2dcb0 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
2dcc0 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = pX;.  }..  /* 
2dcd0 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20  Seed the search 
2dce0 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68  with a single Wh
2dcf0 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69  erePath containi
2dd00 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f  ng zero WhereLoo
2dd10 70 73 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d  ps */.  aFrom[0]
2dd20 2e 6e 52 6f 77 20 3d 20 28 57 68 65 72 65 43 6f  .nRow = (WhereCo
2dd30 73 74 29 31 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20  st)1;.  nFrom = 
2dd40 31 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70  1;..  /* Precomp
2dd50 75 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ute the cost of 
2dd60 73 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61  sorting the fina
2dd70 6c 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66  l result set, if
2dd80 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   the caller.  **
2dd90 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
2dda0 42 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63  Begin() was conc
2ddb0 65 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74  erned about sort
2ddc0 69 6e 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f  ing */.  rSortCo
2ddd0 73 74 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29  st = (WhereCost)
2dde0 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  0;.  if( pWInfo-
2ddf0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2de00 6e 52 6f 77 45 73 74 3c 3d 30 2e 30 20 29 7b 0a  nRowEst<=0.0 ){.
2de10 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f      aFrom[0].isO
2de20 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b  rderedValid = 1;
2de30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2de40 20 43 6f 6d 70 75 74 65 20 61 6e 20 65 73 74 69   Compute an esti
2de50 6d 61 74 65 20 6f 6e 20 74 68 65 20 63 6f 73 74  mate on the cost
2de60 20 74 6f 20 73 6f 72 74 20 74 68 65 20 65 6e 74   to sort the ent
2de70 69 72 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  ire result set *
2de80 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20  /.    rSortCost 
2de90 3d 20 6e 52 6f 77 45 73 74 2a 65 73 74 4c 6f 67  = nRowEst*estLog
2dea0 28 6e 52 6f 77 45 73 74 29 3b 0a 23 69 66 64 65  (nRowEst);.#ifde
2deb0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2dec0 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
2ded0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d  ite3WhereTrace>=
2dee0 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
2def0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
2df00 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d  --- sort cost=%-
2df10 37 2e 32 67 5c 6e 22 2c 20 72 53 6f 72 74 43 6f  7.2g\n", rSortCo
2df20 73 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  st);.    }.#endi
2df30 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  f.  }..  /* Comp
2df40 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79  ute successively
2df50 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74   longer WherePat
2df60 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  hs using the pre
2df70 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e  vious generation
2df80 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61  .  ** of WherePa
2df90 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73  ths as the basis
2dfa0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20   for the next.  
2dfb0 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
2dfc0 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20  e mxChoice.  ** 
2dfd0 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61  best paths at ea
2dfe0 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  ch generation */
2dff0 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
2e000 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
2e010 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d  op++){.    nTo =
2e020 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
2e030 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69  , pFrom=aFrom; i
2e040 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70  i<nFrom; ii++, p
2e050 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66  From++){.      f
2e060 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f  or(pWLoop=pWInfo
2e070 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70  ->pLoops; pWLoop
2e080 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d  ; pWLoop=pWLoop-
2e090 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
2e0a0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
2e0b0 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 42 69  kNew;.        Bi
2e0c0 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
2e0d0 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73  0;.        u8 is
2e0e0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 70  OrderedValid = p
2e0f0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56  From->isOrderedV
2e100 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 75 38  alid;.        u8
2e110 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72   isOrdered = pFr
2e120 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20  om->isOrdered;. 
2e130 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
2e140 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
2e150 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
2e160 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2e170 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
2e180 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
2e190 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
2e1a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2e1b0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
2e1c0 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
2e1d0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
2e1e0 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
2e1f0 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
2e200 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
2e210 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74  */.        rCost
2e220 20 3d 20 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75   = pWLoop->rSetu
2e230 70 20 2b 20 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e  p + pWLoop->rRun
2e240 2a 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70  *pFrom->nRow + p
2e250 46 72 6f 6d 2d 3e 72 43 6f 73 74 3b 0a 20 20 20  From->rCost;.   
2e260 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70       maskNew = p
2e270 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
2e280 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
2e290 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  f;.        if( !
2e2a0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29  isOrderedValid )
2e2b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74  {.          swit
2e2c0 63 68 28 20 77 68 65 72 65 50 61 74 68 53 61 74  ch( wherePathSat
2e2d0 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
2e2e0 49 6e 66 6f 2c 20 70 46 72 6f 6d 2c 20 69 4c 6f  Info, pFrom, iLo
2e2f0 6f 70 2c 20 69 4c 6f 6f 70 3d 3d 6e 4c 6f 6f 70  op, iLoop==nLoop
2e300 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1,.            
2e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e330 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b  pWLoop, &revMask
2e340 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2e350 20 63 61 73 65 20 31 3a 20 20 2f 2a 20 59 65 73   case 1:  /* Yes
2e360 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20  .  pFrom+pWLoop 
2e370 64 6f 65 73 20 73 61 74 69 73 66 79 20 74 68 65  does satisfy the
2e380 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2e390 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2e3a0 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b    isOrdered = 1;
2e3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2e3c0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
2e3d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
2e3e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2e3f0 20 20 20 20 63 61 73 65 20 30 3a 20 20 2f 2a 20      case 0:  /* 
2e400 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f  No.  pFrom+pWLoo
2e410 70 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  p will require a
2e420 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 2a   separate sort *
2e430 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
2e440 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20  isOrdered = 0;. 
2e450 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2e460 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b  rderedValid = 1;
2e470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2e480 43 6f 73 74 20 2b 3d 20 72 53 6f 72 74 43 6f 73  Cost += rSortCos
2e490 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
2e4a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2e4b0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20      default: /* 
2e4c0 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e  Cannot tell yet.
2e4d0 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74    Try again on t
2e4e0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
2e4f0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
2e500 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2e510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2e520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
2e530 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
2e540 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  revLoop;.       
2e550 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   }.        /* Ch
2e560 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
2e570 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
2e580 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68  dded to the mxCh
2e590 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66 61 72  oice best so far
2e5a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
2e5b0 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a  jj=0, pTo=aTo; j
2e5c0 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  j<nTo; jj++, pTo
2e5d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2e5e0 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70  f( pTo->maskLoop
2e5f0 3d 3d 6d 61 73 6b 4e 65 77 20 26 26 20 70 54 6f  ==maskNew && pTo
2e600 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
2e610 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ==isOrderedValid
2e620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e630 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2e640 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2e650 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f       if( jj>=nTo
2e660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2e670 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
2e680 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74  && rCost>=mxCost
2e690 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45   ){.#ifdef WHERE
2e6a0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2e6b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2e6c0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
2e6d0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
2e6e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2e6f0 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20  gPrintf("Skip   
2e700 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20 6f  %s cost=%-7.2g o
2e710 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
2e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2e730 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
2e740 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
2e750 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  ), rCost,.      
2e760 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2e770 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
2e780 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
2e790 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
2e7a0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
2e7b0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  f.            co
2e7c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2e7d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
2e7e0 20 41 64 64 20 61 20 6e 65 77 20 50 61 74 68 20   Add a new Path 
2e7f0 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74  to the aTo[] set
2e800 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2e810 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29  ( nTo<mxChoice )
2e820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2e830 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   Increase the si
2e840 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65  ze of the aTo se
2e850 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20  t by one */.    
2e860 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f          jj = nTo
2e870 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
2e880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2e890 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70   /* New path rep
2e8a0 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20  laces the prior 
2e8b0 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f  worst to keep co
2e8c0 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69  unt below mxChoi
2e8d0 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ce */.          
2e8e0 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b 20    for(jj=nTo-1; 
2e8f0 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d 78  aTo[jj].rCost<mx
2e900 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73 73  Cost; jj--){ ass
2e910 65 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20 20  ert(jj>0); }.   
2e920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e930 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
2e940 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
2e950 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2e960 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2e970 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
2e980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e990 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2e9a0 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f  tf("New    %s co
2e9b0 73 74 3d 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d  st=%-7.2g order=
2e9c0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
2e9d0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
2e9e0 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
2e9f0 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
2ea00 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2ea10 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
2ea20 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
2ea30 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
2ea40 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
2ea50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
2ea60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ea70 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d  if( pTo->rCost<=
2ea80 72 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20  rCost ){.#ifdef 
2ea90 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2eaa0 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ED.            i
2eab0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2eac0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
2ead0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2eae0 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
2eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb00 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
2eb10 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25 63 22  %-7.2g order=%c"
2eb20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2eb30 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2eb40 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
2eb50 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a  pWLoop), rCost,.
2eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb70 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
2eb80 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
2eb90 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
2eba0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2ebb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2ebc0 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f  ntf("   vs %s co
2ebd0 73 74 3d 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d  st=%-7.2g order=
2ebe0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
2ebf0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
2ec00 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
2ec10 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
2ec20 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ost,.           
2ec30 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
2ec40 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54  deredValid ? (pT
2ec50 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27  o->isOrdered ? '
2ec60 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2ec70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2ec80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
2ec90 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2eca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ecb0 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20     /* A new and 
2ecc0 62 65 74 74 65 72 20 73 63 6f 72 65 20 66 6f 72  better score for
2ecd0 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 63 72   a previously cr
2ece0 65 61 74 65 64 20 65 71 75 69 76 61 6c 65 6e 74  eated equivalent
2ecf0 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65 66 20   path */.#ifdef 
2ed00 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2ed10 45 44 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ED.          if(
2ed20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2ed30 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
2ed40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2ed50 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
2ed60 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74            "Updat
2ed70 65 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67  e %s cost=%-7.2g
2ed80 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
2ed90 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2eda0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
2edb0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
2edc0 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20   rCost,.        
2edd0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2ede0 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
2edf0 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
2ee00 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2ee10 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2ee20 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25  gPrintf("  was %
2ee30 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20 6f 72  s cost=%-7.2g or
2ee40 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
2ee50 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2ee60 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
2ee70 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
2ee80 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20  rCost,.         
2ee90 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
2eea0 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54  deredValid ? (pT
2eeb0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27  o->isOrdered ? '
2eec0 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2eed0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
2eee0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
2eef0 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70         /* pWLoop
2ef00 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41   is a winner.  A
2ef10 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74  dd it to the set
2ef20 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20   of best so far 
2ef30 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  */.        pTo->
2ef40 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  maskLoop = pFrom
2ef50 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
2ef60 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2ef70 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c         pTo->revL
2ef80 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  oop = revMask;. 
2ef90 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77         pTo->nRow
2efa0 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2a   = pFrom->nRow *
2efb0 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20   pWLoop->nOut;. 
2efc0 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73         pTo->rCos
2efd0 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20  t = rCost;.     
2efe0 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
2eff0 64 56 61 6c 69 64 20 3d 20 69 73 4f 72 64 65 72  dValid = isOrder
2f000 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20  edValid;.       
2f010 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20   pTo->isOrdered 
2f020 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  = isOrdered;.   
2f030 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d       memcpy(pTo-
2f040 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61  >aLoop, pFrom->a
2f050 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65  Loop, sizeof(Whe
2f060 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b  reLoop*)*iLoop);
2f070 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c  .        pTo->aL
2f080 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c  oop[iLoop] = pWL
2f090 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  oop;.        if(
2f0a0 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29   nTo>=mxChoice )
2f0b0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f  {.          mxCo
2f0c0 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73  st = aTo[0].rCos
2f0d0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  t;.          for
2f0e0 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b  (jj=1, pTo=&aTo[
2f0f0 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b  1]; jj<mxChoice;
2f100 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
2f110 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2f120 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74  To->rCost>mxCost
2f130 20 29 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d   ) mxCost = pTo-
2f140 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  >rCost;.        
2f150 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f160 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
2f170 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2f180 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
2f190 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2f1a0 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >=2 ){.      sql
2f1b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2f1c0 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e  "---- after roun
2f1d0 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c  d %d ----\n", iL
2f1e0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  oop);.      for(
2f1f0 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69  ii=0, pTo=aTo; i
2f200 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f  i<nTo; ii++, pTo
2f210 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
2f220 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2f230 22 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67  " %s cost=%-7.2g
2f240 20 6e 72 6f 77 3d 25 2d 37 2e 32 67 20 6f 72 64   nrow=%-7.2g ord
2f250 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
2f260 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
2f270 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
2f280 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
2f290 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
2f2a0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
2f2b0 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d  redValid ? (pTo-
2f2c0 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  >isOrdered ? 'Y'
2f2d0 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
2f2e0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
2f2f0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
2f300 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  && pTo->isOrdere
2f310 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
2f320 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2f330 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e  f(" rev=0x%llx\n
2f340 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29  ", pTo->revLoop)
2f350 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2f360 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2f370 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
2f380 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
2f390 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2f3a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70  dif..    /* Swap
2f3b0 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46   the roles of aF
2f3c0 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20  rom and aTo for 
2f3d0 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74  the next generat
2f3e0 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d  ion */.    pFrom
2f3f0 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20   = aTo;.    aTo 
2f400 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72  = aFrom;.    aFr
2f410 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20  om = pFrom;.    
2f420 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d  nFrom = nTo;.  }
2f430 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30  ..  if( nFrom==0
2f440 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2f450 72 72 6f 72 4d 73 67 28 70 57 49 6e 66 6f 2d 3e  rrorMsg(pWInfo->
2f460 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72  pParse, "no quer
2f470 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20  y solution");.  
2f480 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2f490 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
2f4a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2f4b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
2f4c0 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
2f4d0 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
2f4e0 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
2f4f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
2f500 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
2f510 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72  m = aFrom;.  for
2f520 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b  (ii=1; ii<nFrom;
2f530 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
2f540 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72  pFrom->rCost>aFr
2f550 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70  om[ii].rCost ) p
2f560 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69  From = &aFrom[ii
2f570 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
2f580 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
2f590 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
2f5a0 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
2f5b0 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
2f5c0 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
2f5d0 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
2f5e0 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
2f5f0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
2f600 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
2f610 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
2f620 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
2f630 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
2f640 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
2f650 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
2f660 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 20 2f   pWLoop->iTab; /
2f670 2a 20 46 49 58 4d 45 3a 20 4f 6d 69 74 20 74 68  * FIXME: Omit th
2f680 65 20 69 46 72 6f 6d 20 66 69 65 6c 64 20 2a 2f  e iFrom field */
2f690 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
2f6a0 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  bCur = pWInfo->p
2f6b0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2f6c0 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
2f6d0 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72  r;.  }.  if( pFr
2f6e0 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b  om->isOrdered ){
2f6f0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  .    pWInfo->nOB
2f700 53 61 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f  Sat = pWInfo->pO
2f710 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
2f720 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
2f730 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
2f740 6f 6f 70 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  oop;.  }.  pWInf
2f750 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72  o->nRowOut = pFr
2f760 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20  om->nRow;..  /* 
2f770 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d  Free temporary m
2f780 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e  emory and return
2f790 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71   success */.  sq
2f7a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2f7b0 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72  pSpace);.  retur
2f7c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2f7d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
2f7e0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
2f7f0 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
2f800 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
2f810 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
2f820 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2f830 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2f840 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
2f850 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
2f860 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
2f870 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
2f880 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
2f890 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
2f8a0 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
2f8b0 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
2f8c0 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
2f8d0 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
2f8e0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
2f8f0 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
2f900 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
2f910 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
2f920 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
2f930 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2f940 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
2f950 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
2f960 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
2f970 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
2f980 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
2f990 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
2f9a0 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
2f9b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
2f9c0 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
2f9d0 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
2f9e0 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
2f9f0 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
2fa00 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
2fa10 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
2fa20 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
2fa30 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
2fa40 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
2fa50 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
2fa60 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2fa70 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
2fa80 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
2fa90 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
2faa0 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
2fab0 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
2fac0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
2fad0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
2fae0 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
2faf0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
2fb00 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
2fb10 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
2fb20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
2fb30 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2fb40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
2fb50 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
2fb60 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
2fb70 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
2fb80 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
2fba0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
2fbb0 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
2fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbd0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
2fbe0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
2fbf0 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
2fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc10 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
2fc20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
2fc30 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
2fc40 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
2fc50 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
2fc60 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
2fc70 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
2fc80 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
2fc90 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
2fca0 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
2fcb0 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
2fcc0 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
2fcd0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
2fce0 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
2fcf0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
2fd00 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
2fd10 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
2fd20 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
2fd30 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
2fd40 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
2fd50 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
2fd60 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
2fd70 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
2fd80 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
2fd90 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
2fda0 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
2fdb0 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
2fdc0 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
2fdd0 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
2fde0 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
2fdf0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
2fe00 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
2fe10 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
2fe20 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
2fe30 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
2fe40 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
2fe50 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
2fe60 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
2fe70 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
2fe80 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
2fe90 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
2fea0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2feb0 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
2fec0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
2fed0 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
2fee0 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
2fef0 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
2ff00 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
2ff10 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
2ff20 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
2ff30 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
2ff40 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
2ff50 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
2ff60 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
2ff70 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
2ff80 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
2ff90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
2ffa0 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
2ffb0 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
2ffc0 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
2ffd0 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
2ffe0 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
2fff0 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
30000 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
30010 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
30020 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
30030 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
30040 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
30050 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
30060 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
30070 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
30080 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
30090 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
300a0 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
300b0 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
300c0 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
300d0 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
300e0 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
300f0 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
30100 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
30110 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
30120 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
30130 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
30140 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
30150 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
30160 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
30170 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
30180 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
30190 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
301a0 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
301b0 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
301c0 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
301d0 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
301e0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
301f0 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
30200 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
30210 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
30220 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
30230 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
30240 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
30250 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
30260 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
30270 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
30280 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
30290 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
302a0 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
302b0 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
302c0 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
302d0 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
302e0 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
302f0 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
30300 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
30310 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
30320 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
30330 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
30340 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
30350 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
30360 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
30370 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
30380 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
30390 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
303a0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
303b0 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
303c0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
303d0 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
303e0 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
303f0 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
30400 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
30410 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
30420 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
30430 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
30440 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
30450 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
30460 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
30470 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
30480 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65  ement,.** if the
30490 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
304a0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
304b0 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
304c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
304d0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
304e0 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
304f0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
30500 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20  hen pOrderBy is 
30510 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
30520 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  n index can be u
30530 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  sed so that the 
30540 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f  natural output o
30550 72 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rder of the tabl
30560 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72  e.** scan is cor
30570 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44  rect for the ORD
30580 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
30590 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73  en that index is
305a0 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65   used and.** the
305b0 20 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49   returned WhereI
305c0 6e 66 6f 2e 6e 4f 42 53 61 74 20 66 69 65 6c 64  nfo.nOBSat field
305d0 20 69 73 20 73 65 74 20 74 6f 20 70 4f 72 64 65   is set to pOrde
305e0 72 42 79 2d 3e 6e 45 78 70 72 2e 20 20 54 68 69  rBy->nExpr.  Thi
305f0 73 0a 2a 2a 20 69 73 20 61 6e 20 6f 70 74 69 6d  s.** is an optim
30600 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65  ization that pre
30610 76 65 6e 74 73 20 61 6e 20 75 6e 6e 65 63 65 73  vents an unneces
30620 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65  sary sort of the
30630 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 69   result set.** i
30640 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f  f an index appro
30650 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 4f  priate for the O
30660 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
30670 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a  lready exists..*
30680 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72  *.** If the wher
30690 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63  e clause loops c
306a0 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65  annot be arrange
306b0 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
306c0 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70   correct.** outp
306d0 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 57  ut order, then W
306e0 68 65 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74 20  hereInfo.nOBSat 
306f0 69 73 20 30 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e  is 0..*/.WhereIn
30700 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  fo *sqlite3Where
30710 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a  Begin(.  Parse *
30720 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
30730 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
30740 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
30750 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
30760 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
30770 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63   tables to be sc
30780 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  anned */.  Expr 
30790 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
307a0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
307b0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
307c0 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
307d0 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63  /* An ORDER BY c
307e0 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
307f0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44  /.  ExprList *pD
30800 69 73 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65  istinct,  /* The
30810 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72   select-list for
30820 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 69 65   DISTINCT querie
30830 73 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  s - or NULL */. 
30840 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
30850 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
30860 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
30870 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
30880 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69  liteInt.h */.  i
30890 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20  nt iIdxCur      
308a0 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45       /* If WHERE
308b0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
308c0 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72  s set, index cur
308d0 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  sor number */.){
308e0 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66  .  int nByteWInf
308f0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
30900 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f   Num. bytes allo
30910 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49  cated for WhereI
30920 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  nfo struct */.  
30930 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20  int nTabList;   
30940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
30950 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
30960 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a   in pTabList */.
30970 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
30980 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
30990 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
309a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
309b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
309c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
309d0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
309e0 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
309f0 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
30a00 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
30a10 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
30a20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
30a30 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
30a40 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ned */.  WhereLo
30a50 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20  opBuilder sWLB; 
30a60 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
30a70 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a  Loop builder */.
30a80 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
30a90 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  pMaskSet;    /* 
30aa0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
30ab0 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
30ac0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
30ad0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
30ae0 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49  gle level in pWI
30af0 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e  nfo->a[] */.  in
30b00 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
30b10 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
30b20 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71   counter */.  sq
30b30 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
30b40 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
30b50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
30b60 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
30b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
30b90 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  /...  /* Variabl
30ba0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
30bb0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 57   */.  memset(&sW
30bc0 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  LB, 0, sizeof(sW
30bd0 4c 42 29 29 3b 0a 20 20 73 57 4c 42 2e 70 4f 72  LB));.  sWLB.pOr
30be0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
30bf0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  ;..  /* The numb
30c00 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
30c10 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
30c20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
30c30 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
30c40 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
30c50 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  sk .  */.  testc
30c60 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ase( pTabList->n
30c70 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66  Src==BMS );.  if
30c80 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
30c90 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
30ca0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
30cb0 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
30cc0 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
30cd0 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
30ce0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
30cf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
30d00 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
30d10 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
30d20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
30d30 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
30d40 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
30d50 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
30d60 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  Y flag is set, t
30d70 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
30d80 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
30d90 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
30da0 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
30db0 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
30dc0 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
30dd0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
30de0 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
30df0 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
30e00 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
30e10 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
30e20 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
30e30 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
30e40 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
30e50 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
30e60 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
30e70 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
30e80 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
30e90 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
30ea0 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
30eb0 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
30ec0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
30ed0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
30ee0 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
30ef0 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
30f00 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
30f10 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
30f20 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
30f30 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
30f40 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
30f50 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
30f60 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
30f70 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
30f80 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
30f90 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
30fa0 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
30fb0 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
30fc0 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
30fd0 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
30fe0 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
30ff0 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  .  */.  db = pPa
31000 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65  rse->db;.  nByte
31010 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73  WInfo = ROUND8(s
31020 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
31030 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69  +(nTabList-1)*si
31040 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
31050 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  );.  pWInfo = sq
31060 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
31070 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f  o(db, nByteWInfo
31080 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
31090 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
310a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
310b0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  b, pWInfo);.    
310c0 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pWInfo = 0;.    
310d0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
310e0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  rror;.  }.  pWIn
310f0 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61  fo->nLevel = nTa
31100 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
31110 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  >pParse = pParse
31120 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  ;.  pWInfo->pTab
31130 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
31140 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  .  pWInfo->pOrde
31150 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
31160 20 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69    pWInfo->pDisti
31170 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 3b  nct = pDistinct;
31180 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  .  pWInfo->iBrea
31190 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
311a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
311b0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
311c0 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
311d0 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e    pWInfo->savedN
311e0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
311f0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
31200 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57    pMaskSet = &pW
31210 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a  Info->sMaskSet;.
31220 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20    sWLB.pWInfo = 
31230 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70  pWInfo;.  sWLB.p
31240 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
31250 43 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65  C;..  /* Disable
31260 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
31270 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51  timization if SQ
31280 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
31290 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a   is set via.  **
312a0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74   sqlite3_test_ct
312b0 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  rl(SQLITE_TESTCT
312c0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
312d0 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f  ,...) */.  if( O
312e0 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
312f0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  led(db, SQLITE_D
31300 69 73 74 69 6e 63 74 4f 70 74 29 20 29 20 70 44  istinctOpt) ) pD
31310 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 0a 20 20  istinct = 0;..  
31320 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
31330 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
31340 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
31350 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
31360 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
31370 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
31380 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
31390 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
313a0 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
313b0 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  t);.  whereClaus
313c0 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
313d0 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
313e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
313f0 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
31400 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
31410 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  Split(&pWInfo->s
31420 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  WC, pWhere, TK_A
31430 4e 44 29 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ND);   /* IMP: R
31440 2d 31 35 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a  -15842-53296 */.
31450 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
31460 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
31470 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
31480 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
31490 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
314a0 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
314b0 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
314c0 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
314d0 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
314e0 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28   if( pWhere && (
314f0 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73  nTabList==0 || s
31500 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
31510 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65  tantNotJoin(pWhe
31520 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  re)) ){.    sqli
31530 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
31540 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70  Parse, pWhere, p
31550 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53  WInfo->iBreak, S
31560 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
31570 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
31580 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73  0;.  }..  /* Ass
31590 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
315a0 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
315b0 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
315c0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
315d0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69  *.  ** When assi
315e0 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61  gning bitmask va
315f0 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61  lues to FROM cla
31600 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  use cursors, it 
31610 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65  must be.  ** the
31620 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20   case that if X 
31630 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
31640 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d  or the N-th FROM
31650 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65   clause term the
31660 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61  n.  ** the bitma
31670 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20  sk for all FROM 
31680 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20  clause terms to 
31690 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
316a0 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69  N-th term.  ** i
316b0 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78  s (X-1).   An ex
316c0 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
316d0 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
316e0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75   LEFT JOIN can u
316f0 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72  se.  ** its Expr
31700 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
31710 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74   value to find t
31720 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68  he bitmask of th
31730 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
31740 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
31750 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65   Subtracting one
31760 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20   from the right 
31770 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69  table bitmask gi
31780 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61  ves a.  ** bitma
31790 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  sk for all table
317a0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
317b0 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77   the join.  Know
317c0 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a  ing the bitmask.
317d0 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62    ** for all tab
317e0 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
317f0 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
31800 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  s important.  Ti
31810 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
31820 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
31830 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
31840 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
31850 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
31860 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c  es in.  ** pTabL
31870 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ist, not just th
31880 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74  e first nTabList
31890 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69   tables.  nTabLi
318a0 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20  st is normally. 
318b0 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61   ** equal to pTa
318c0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20  bList->nSrc but 
318d0 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e  might be shorten
318e0 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20  ed to 1 if the. 
318f0 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   ** WHERE_ONETAB
31900 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
31910 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
31920 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
31930 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
31940 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
31950 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
31960 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
31970 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  );.  }.#ifndef N
31980 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69  DEBUG.  {.    Bi
31990 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20  tmask toTheLeft 
319a0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
319b0 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
319c0 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
319d0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
319e0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
319f0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
31a00 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
31a10 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
31a20 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
31a30 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
31a40 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
31a50 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
31a60 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
31a70 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
31a80 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
31a90 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
31aa0 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
31ab0 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
31ac0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
31ad0 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
31ae0 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
31af0 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
31b00 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
31b10 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
31b20 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
31b30 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
31b40 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
31b50 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
31b60 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
31b70 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78  essed..  */.  ex
31b80 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
31b90 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
31ba0 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
31bb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
31bc0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
31bd0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
31be0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
31bf0 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
31c00 69 65 72 2c 20 69 66 20 74 68 65 72 65 20 69 73  ier, if there is
31c10 20 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e 64 61   one, is redunda
31c20 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69 74 20  nt. .  ** If it 
31c30 69 73 2c 20 74 68 65 6e 20 73 65 74 20 70 44 69  is, then set pDi
31c40 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c 20 61  stinct to NULL a
31c50 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e 65 44 69  nd WhereInfo.eDi
31c60 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a 20 57  stinct to.  ** W
31c70 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
31c80 49 51 55 45 20 74 6f 20 74 65 6c 6c 20 74 68 65  IQUE to tell the
31c90 20 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e 6f 72   caller to ignor
31ca0 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 2e 0a  e the DISTINCT..
31cb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 69 73 74    */.  if( pDist
31cc0 69 6e 63 74 20 26 26 20 69 73 44 69 73 74 69 6e  inct && isDistin
31cd0 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72  ctRedundant(pPar
31ce0 73 65 2c 70 54 61 62 4c 69 73 74 2c 26 70 57 49  se,pTabList,&pWI
31cf0 6e 66 6f 2d 3e 73 57 43 2c 70 44 69 73 74 69 6e  nfo->sWC,pDistin
31d00 63 74 29 20 29 7b 0a 20 20 20 20 70 44 69 73 74  ct) ){.    pDist
31d10 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 70 57  inct = 0;.    pW
31d20 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
31d30 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
31d40 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20 20  _UNIQUE;.  }..  
31d50 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
31d60 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
31d70 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41  ts */.  WHERETRA
31d80 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
31d90 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29  er Start ***\n")
31da0 29 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c  );.  rc = whereL
31db0 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29  oopAddAll(&sWLB)
31dc0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
31dd0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
31de0 72 3b 0a 0a 20 20 2f 2a 20 44 69 73 70 6c 61 79  r;..  /* Display
31df0 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72   all of the Wher
31e00 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 66  eLoop objects if
31e10 20 77 68 65 72 65 74 72 61 63 65 20 69 73 20 65   wheretrace is e
31e20 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66  nabled */.#ifdef
31e30 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
31e40 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
31e50 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20  3WhereTrace ){. 
31e60 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
31e70 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
31e80 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
31e90 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
31ea0 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
31eb0 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
31ec0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
31ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ee0 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48         "ABCDEFGH
31ef0 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59  IJKLMNOPQRSTUVWY
31f00 58 5a 22 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  XZ";.    for(p=p
31f10 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70  WInfo->pLoops; p
31f20 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ; p=p->pNextLoop
31f30 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 49 64 20  ){.      p->cId 
31f40 3d 20 7a 4c 61 62 65 6c 5b 28 69 2b 2b 29 25 73  = zLabel[(i++)%s
31f50 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a  izeof(zLabel)];.
31f60 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
31f70 72 69 6e 74 28 70 2c 20 70 54 61 62 4c 69 73 74  rint(p, pTabList
31f80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
31f90 64 69 66 0a 0a 20 20 77 68 65 72 65 50 61 74 68  dif..  wherePath
31fa0 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 2d  Solver(pWInfo, -
31fb0 31 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  1);.  if( db->ma
31fc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
31fd0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
31fe0 72 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  r;.  if( pWInfo-
31ff0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
32000 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
32010 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  r(pWInfo, pWInfo
32020 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20  ->nRowOut);.    
32030 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
32040 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
32050 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
32060 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66 6c  }else if( db->fl
32070 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76  ags & SQLITE_Rev
32080 65 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20 20  erseOrder ){.   
32090 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
320a0 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31  k = (Bitmask)(-1
320b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
320c0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
320d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
320e0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
320f0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23  eginError;.  }.#
32100 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
32110 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
32120 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
32130 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   ){.    int ii;.
32140 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32150 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
32160 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 69 66 28  ution");.    if(
32170 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
32180 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32190 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52  DebugPrintf(" OR
321a0 44 45 52 20 42 59 20 6f 6d 69 74 74 65 64 20 72  DER BY omitted r
321b0 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 57  ev=0x%llx\n", pW
321c0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a  Info->revMask);.
321d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
321e0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
321f0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  ntf("\n");.    }
32200 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
32210 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
32220 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
32230 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e  opPrint(pWInfo->
32240 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 70 54  a[ii].pWLoop, pT
32250 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  abList);.    }. 
32260 20 7d 0a 23 65 6e 64 69 66 0a 20 20 57 48 45 52   }.#endif.  WHER
32270 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74  ETRACE(("*** Opt
32280 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
32290 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 23 69 66 20 30  ***\n"));..#if 0
322a0 20 20 2f 2a 20 46 49 58 4d 45 3a 20 41 64 64 20    /* FIXME: Add 
322b0 74 68 69 73 20 62 61 63 6b 20 69 6e 3f 20 2a 2f  this back in? */
322c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
322d0 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
322e0 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
322f0 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
32300 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
32310 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
32320 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
32330 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
32340 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
32350 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
32360 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
32370 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
32380 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
32390 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  ts.  ** the stat
323a0 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20  ement to update 
323b0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
323c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
323d0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
323e0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
323f0 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
32400 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
32410 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
32420 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
32430 45 53 49 52 45 44 29 21 3d 30 20 26 26 20 28 61  ESIRED)!=0 && (a
32440 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
32450 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20  ONEROW)!=0 ){.  
32460 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50    pWInfo->okOneP
32470 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49  ass = 1;.    pWI
32480 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77  nfo->a[0].plan.w
32490 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
324a0 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 23  _IDX_ONLY;.  }.#
324b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 70 65 6e  endif..  /* Open
324c0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   all tables in t
324d0 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  he pTabList and 
324e0 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65  any indices sele
324f0 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65  cted for.  ** se
32500 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61  arching those ta
32510 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  bles..  */.  sql
32520 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
32530 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29  hema(pParse, -1)
32540 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20  ; /* Insert the 
32550 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20  cookie verifier 
32560 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  Goto */.  notRea
32570 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
32580 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  ;.  pWInfo->nRow
32590 4f 75 74 20 3d 20 28 57 68 65 72 65 43 6f 73 74  Out = (WhereCost
325a0 29 31 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20  )1;.  for(ii=0, 
325b0 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
325c0 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
325d0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
325e0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
325f0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
32600 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
32610 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
32620 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
32630 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
32640 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
32650 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
32660 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a  item *pTabItem;.
32670 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
32680 4c 6f 6f 70 3b 0a 0a 20 20 20 20 70 54 61 62 49  Loop;..    pTabI
32690 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
326a0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
326b0 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
326c0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
326d0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
326e0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
326f0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
32700 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
32710 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
32720 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
32730 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
32740 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d  ral)!=0 || pTab-
32750 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
32760 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
32770 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66  */.    }else.#if
32780 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32790 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
327a0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
327b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
327c0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
327d0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
327e0 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e  ar *pVTab = (con
327f0 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
32800 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
32810 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Tab);.      int 
32820 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
32830 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
32840 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
32850 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69  4(v, OP_VOpen, i
32860 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62  Cur, 0, 0, pVTab
32870 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
32880 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
32890 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
328a0 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20     /* noop */.  
328b0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
328c0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
328d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
328e0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
328f0 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
32900 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
32910 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20  _OPEN_CLOSE)==0 
32920 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
32930 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  = pWInfo->okOneP
32940 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69  ass ? OP_OpenWri
32950 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64  te : OP_OpenRead
32960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
32970 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
32980 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
32990 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
329a0 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  p);.      testca
329b0 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  se( pTab->nCol==
329c0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
329d0 65 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e  estcase( pTab->n
329e0 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
329f0 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
32a00 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
32a10 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20  ->nCol<BMS ){.  
32a20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
32a30 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
32a40 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
32a50 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
32a60 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
32a70 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
32a80 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
32a90 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP4(v, sqlite3Vd
32aa0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
32ab0 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
32ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ad0 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
32ae0 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29  TR(n), P4_INT32)
32af0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
32b00 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
32b10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
32b20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
32b30 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
32b40 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
32b50 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
32b60 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Name);.    }.#if
32b70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32b80 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
32b90 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
32ba0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
32bb0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20  _TEMP_INDEX)!=0 
32bc0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75  ){.      constru
32bd0 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
32be0 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f  (pParse, &pWInfo
32bf0 2d 3e 73 57 43 2c 20 70 54 61 62 49 74 65 6d 2c  ->sWC, pTabItem,
32c00 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
32c10 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  l);.    }else.#e
32c20 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 6f  ndif.    if( pLo
32c30 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
32c40 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
32c50 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
32c60 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
32c70 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 4b  .pIndex;.      K
32c80 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
32c90 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
32ca0 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
32cb0 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a  .      /* FIXME:
32cc0 20 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61    As an optimiza
32cd0 74 69 6f 6e 20 75 73 65 20 70 54 61 62 49 74 65  tion use pTabIte
32ce0 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66 20 57 48  m->iCursor if WH
32cf0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f 0a  ERE_IDX_ONLY */.
32d00 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
32d10 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
32d20 64 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 20  dxCur = iIdxCur 
32d30 3f 20 69 49 64 78 43 75 72 20 3a 20 70 50 61 72  ? iIdxCur : pPar
32d40 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
32d50 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
32d60 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
32d70 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61  chema );.      a
32d80 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75 72  ssert( iIndexCur
32d90 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  >=0 );.      sql
32da0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
32db0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
32dc0 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74  IndexCur, pIx->t
32dd0 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  num, iDb,.      
32de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32df0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50    (char*)pKey, P
32e00 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
32e10 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  F);.      VdbeCo
32e20 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
32e30 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  pIx->zName));.  
32e40 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
32e50 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
32e60 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
32e70 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
32e80 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
32e90 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74  sMaskSet, pTabIt
32ea0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
32eb0 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
32ec0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
32ed0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
32ee0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
32ef0 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
32f00 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
32f10 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
32f20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73  code to do the s
32f30 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65  earch.  Each ite
32f40 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  ration of the fo
32f50 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f  r.  ** loop belo
32f60 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  w generates code
32f70 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65   for a single ne
32f80 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
32f90 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d   VM.  ** program
32fa0 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
32fb0 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
32fc0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
32fd0 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b  nTabList; ii++){
32fe0 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
32ff0 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20  WInfo->a[ii];.  
33000 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
33010 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
33020 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70  t, pLevel, ii, p
33030 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63  Level->iFrom, wc
33040 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 6e  trlFlags);.    n
33050 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e  otReady = codeOn
33060 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66  eLoopStart(pWInf
33070 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29  o, ii, notReady)
33080 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
33090 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
330a0 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a  ->addrCont;.  }.
330b0 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20  .  /* Done. */. 
330c0 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a   return pWInfo;.
330d0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
330e0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
330f0 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72  */.whereBeginErr
33100 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  or:.  if( pWInfo
33110 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
33120 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
33130 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
33140 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49  Loop;.    whereI
33150 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
33160 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fo);.  }.  retur
33170 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
33180 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
33190 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
331a0 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
331b0 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
331c0 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
331d0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
331e0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
331f0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
33200 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
33210 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
33220 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
33230 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
33240 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
33250 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
33260 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
33270 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
33280 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  p;.  SrcList *pT
33290 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
332a0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c  >pTabList;.  sql
332b0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
332c0 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e  e->db;..  /* Gen
332d0 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69  erate loop termi
332e0 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a  nation code..  *
332f0 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
33300 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
33310 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66  );.  for(i=pWInf
33320 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d  o->nLevel-1; i>=
33330 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65  0; i--){.    pLe
33340 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
33350 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  [i];.    pLoop =
33360 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
33370 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
33380 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
33390 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
333a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
333b0 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
333c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
333d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65  dbeAddOp2(v, pLe
333e0 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
333f0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  >p1, pLevel->p2)
33400 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
33410 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
33420 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
33430 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
33440 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
33450 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
33460 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
33470 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
33480 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
33490 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
334a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
334b0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
334c0 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
334d0 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
334e0 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
334f0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
33500 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
33510 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
33520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
33530 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
33540 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
33550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33560 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e  eAddOp2(v, pIn->
33570 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d  eEndLoopOp, pIn-
33580 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
33590 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
335a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
335b0 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
335c0 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  InTop-1);.      
335d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
335e0 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c  bFree(db, pLevel
335f0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b  ->u.in.aInLoop);
33600 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
33610 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
33620 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
33630 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  drBrk);.    if( 
33640 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
33650 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
33660 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
33670 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
33680 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
33690 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
336a0 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  in);.      asser
336b0 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
336c0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
336d0 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
336e0 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73     || (pLoop->ws
336f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
33700 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  DEXED)!=0 );.   
33710 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
33720 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
33730 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
33740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33750 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
33760 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
33770 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
33780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33790 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
337a0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
337b0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D ){.        sql
337c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
337d0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
337e0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
337f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33800 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  ( pLevel->op==OP
33810 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20  _Return ){.     
33820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33830 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
33840 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
33850 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
33860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
33870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33880 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
33890 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
338a0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
338b0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
338c0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
338d0 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
338e0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
338f0 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
33900 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
33910 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
33920 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
33930 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
33940 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
33950 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
33960 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c  Break);..  /* Cl
33970 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
33980 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
33990 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
339a0 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
339b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  */.  assert( pWI
339c0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c  nfo->nLevel==1 |
339d0 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
339e0 3d 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ==pTabList->nSrc
339f0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
33a00 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
33a10 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
33a20 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  l; i++, pLevel++
33a30 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
33a40 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  dx = 0;.    stru
33a50 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
33a60 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
33a70 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
33a80 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
33a90 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
33aa0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
33ab0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
33ac0 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
33ad0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
33ae0 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
33af0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
33b00 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  eral)==0.     &&
33b10 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
33b20 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66  0.     && (pWInf
33b30 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
33b40 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
33b50 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b  CLOSE)==0.    ){
33b60 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
33b70 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
33b80 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
33b90 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
33ba0 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
33bb0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
33bc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33bd0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
33be0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
33bf0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
33c00 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
33c10 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
33c20 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45   && (ws & (WHERE
33c30 5f 49 50 4b 7c 57 48 45 52 45 5f 54 45 4d 50 5f  _IPK|WHERE_TEMP_
33c40 49 4e 44 45 58 29 29 3d 3d 30 20 29 7b 0a 20 20  INDEX))==0 ){.  
33c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33c60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
33c70 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
33c80 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
33c90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
33ca0 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
33cb0 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f  n index, make co
33cc0 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  de substitutions
33cd0 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20   to read data.  
33ce0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
33cf0 64 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63  dex in preferenc
33d00 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20  e to the table. 
33d10 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20  Sometimes, this 
33d20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65  means.    ** the
33d30 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65   table need neve
33d40 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20  r be read from. 
33d50 54 68 69 73 20 69 73 20 61 20 70 65 72 66 6f 72  This is a perfor
33d60 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20  mance boost,.   
33d70 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65 20   ** as the vdbe 
33d80 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69  level waits unti
33d90 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 72  l the table is r
33da0 65 61 64 20 62 65 66 6f 72 65 20 61 63 74 75 61  ead before actua
33db0 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69  lly.    ** seeki
33dc0 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ng the table cur
33dd0 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72  sor to the recor
33de0 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  d corresponding 
33df0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  to the current. 
33e00 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69     ** position i
33e10 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  n the index..   
33e20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c   ** .    ** Call
33e30 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  s to the code ge
33e40 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65  nerator in betwe
33e50 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  en sqlite3WhereB
33e60 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20  egin and.    ** 
33e70 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20  sqlite3WhereEnd 
33e80 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65  will have create
33e90 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65  d code that refe
33ea0 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65  rences the table
33eb0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
33ec0 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61  .  This loop sca
33ed0 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65  ns all that code
33ee0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63   looking for opc
33ef0 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  odes.    ** that
33f00 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74   reference the t
33f10 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74  able and convert
33f20 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f  s them into opco
33f30 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  des that.    ** 
33f40 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e  reference the in
33f50 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
33f60 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
33f70 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45  gs & (WHERE_INDE
33f80 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e  XED|WHERE_IDX_ON
33f90 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  LY) ){.      pId
33fa0 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
33fb0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d  ee.pIndex;.    }
33fc0 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  else if( pLoop->
33fd0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
33fe0 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
33ff0 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
34000 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20  >u.pCovidx;.    
34010 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26  }.    if( pIdx &
34020 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
34030 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  led ){.      int
34040 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20   k, j, last;.   
34050 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
34060 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  .      pOp = sql
34070 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
34080 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a   pWInfo->iTop);.
34090 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c        last = sql
340a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
340b0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  ddr(v);.      fo
340c0 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  r(k=pWInfo->iTop
340d0 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
340e0 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
340f0 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
34100 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
34110 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
34120 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
34130 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
34140 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
34150 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
34160 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
34170 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
34180 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
34190 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
341a0 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b      pOp->p2 = j;
341b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
341c0 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
341d0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
341e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
341f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
34200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34210 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
34220 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
34230 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
34240 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  || j<pIdx->nColu
34250 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  mn );.        }e
34260 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
34270 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b  ode==OP_Rowid ){
34280 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
34290 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
342a0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
342b0 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
342c0 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20  _IdxRowid;.     
342d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
342e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
342f0 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
34300 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
34310 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
34320 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
34330 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
34340 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
34350 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.