/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact fb4bee9bfeb4c1c2019a2ed36cb49d1f72e8dda7:


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 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
23fe0 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54   (WHERE_VIRTUALT
23ff0 41 42 4c 45 7c 57 48 45 52 45 5f 54 45 4d 50 5f  ABLE|WHERE_TEMP_
24000 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66  INDEX) ){.    if
24010 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
24020 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
24030 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76  LE)!=0 && p->u.v
24040 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
24050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
24060 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ee(p->u.vtab.idx
24070 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  Str);.      p->u
24080 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
24090 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76   0;.      p->u.v
240a0 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a  tab.idxStr = 0;.
240b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
240c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
240d0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30  E_TEMP_INDEX)!=0
240e0 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70   && p->u.btree.p
240f0 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
24100 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
24110 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
24120 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Index->zColAff);
24130 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
24140 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
24150 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree.pIndex);.   
24160 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49     p->u.btree.pI
24170 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ndex = 0;.    }.
24180 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61    }.}../*.** Dea
24190 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c  llocate internal
241a0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
241b0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
241c0 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
241d0 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
241e0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
241f0 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
24200 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
24210 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
24220 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
24230 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77   p->aLTerm);.  w
24240 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
24250 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65  on(db, p);.  whe
24260 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d  reLoopInit(p);.}
24270 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ../*.** Increase
24280 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
24290 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70  cation for pLoop
242a0 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65  ->aLTerm[] to be
242b0 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a   at least n..*/.
242c0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
242d0 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
242e0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
242f0 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  p *p, int n){.  
24300 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65  WhereTerm **paNe
24310 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c  w;.  if( p->nLSl
24320 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53  ot>=n ) return S
24330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20  QLITE_OK;.  n = 
24340 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65  (n+7)&~7;.  paNe
24350 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
24360 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
24370 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a  f(p->aLTerm[0])*
24380 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d  n);.  if( paNew=
24390 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
243a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63  TE_NOMEM;.  memc
243b0 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54  py(paNew, p->aLT
243c0 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  erm, sizeof(p->a
243d0 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53  LTerm[0])*p->nLS
243e0 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  lot);.  if( p->a
243f0 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
24400 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
24410 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
24420 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72  erm);.  p->aLTer
24430 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e  m = paNew;.  p->
24440 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65  nLSlot = n;.  re
24450 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24460 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
24470 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  r content from t
24480 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20  he second pLoop 
24490 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a  into the first..
244a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
244b0 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69  ereLoopXfer(sqli
244c0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
244d0 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f  op *pTo, WhereLo
244e0 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  op *pFrom){.  if
244f0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
24500 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d  e(db, pTo, pFrom
24510 2d 3e 6e 4c 54 65 72 6d 29 20 29 20 72 65 74 75  ->nLTerm) ) retu
24520 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
24530 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
24540 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
24550 0a 20 20 70 54 6f 2d 3e 70 72 65 72 65 71 20 3d  .  pTo->prereq =
24560 20 70 46 72 6f 6d 2d 3e 70 72 65 72 65 71 3b 0a   pFrom->prereq;.
24570 20 20 70 54 6f 2d 3e 6d 61 73 6b 53 65 6c 66 20    pTo->maskSelf 
24580 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 53 65 6c  = pFrom->maskSel
24590 66 3b 0a 20 20 70 54 6f 2d 3e 69 54 61 62 20 3d  f;.  pTo->iTab =
245a0 20 70 46 72 6f 6d 2d 3e 69 54 61 62 3b 0a 20 20   pFrom->iTab;.  
245b0 70 54 6f 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  pTo->iSortIdx = 
245c0 70 46 72 6f 6d 2d 3e 69 53 6f 72 74 49 64 78 3b  pFrom->iSortIdx;
245d0 0a 20 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 20 3d  .  pTo->nLTerm =
245e0 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 3b 0a   pFrom->nLTerm;.
245f0 20 20 70 54 6f 2d 3e 72 53 65 74 75 70 20 3d 20    pTo->rSetup = 
24600 70 46 72 6f 6d 2d 3e 72 53 65 74 75 70 3b 0a 20  pFrom->rSetup;. 
24610 20 70 54 6f 2d 3e 72 52 75 6e 20 3d 20 70 46 72   pTo->rRun = pFr
24620 6f 6d 2d 3e 72 52 75 6e 3b 0a 20 20 70 54 6f 2d  om->rRun;.  pTo-
24630 3e 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  >nOut = pFrom->n
24640 4f 75 74 3b 0a 20 20 69 66 28 20 70 54 6f 2d 3e  Out;.  if( pTo->
24650 6e 4c 54 65 72 6d 20 29 7b 0a 20 20 20 20 6d 65  nLTerm ){.    me
24660 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  mcpy(pTo->aLTerm
24670 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c  , pFrom->aLTerm,
24680 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a   pTo->nLTerm*siz
24690 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b  eof(pTo->aLTerm[
246a0 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 70 54 6f 2d  0]));.  }.  pTo-
246b0 3e 77 73 46 6c 61 67 73 20 3d 20 70 46 72 6f 6d  >wsFlags = pFrom
246c0 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 70 54 6f  ->wsFlags;.  pTo
246d0 2d 3e 75 20 3d 20 70 46 72 6f 6d 2d 3e 75 3b 0a  ->u = pFrom->u;.
246e0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46    if( pFrom->wsF
246f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
24700 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
24710 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e   pFrom->u.vtab.n
24720 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
24730 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d  else if( (pFrom-
24740 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
24750 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20  _TEMP_INDEX)!=0 
24760 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
24770 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
24780 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
24790 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
247a0 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72  ** Delete a Wher
247b0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
247c0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
247d0 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69  eLoopDelete(sqli
247e0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
247f0 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c  op *p){.  whereL
24800 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b  oopClear(db, p);
24810 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
24820 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
24830 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
24840 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
24850 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
24860 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
24870 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
24880 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
24890 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20   ALWAYS(pWInfo) 
248a0 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  ){.    whereClau
248b0 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d  seClear(&pWInfo-
248c0 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65  >sWC);.    while
248d0 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  ( pWInfo->pLoops
248e0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
248f0 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d  oop *p = pWInfo-
24900 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70  >pLoops;.      p
24910 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20  WInfo->pLoops = 
24920 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
24930 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
24940 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
24950 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
24960 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
24970 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
24980 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20  sert or replace 
24990 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  a WhereLoop entr
249a0 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70  y using the temp
249b0 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a  late supplied..*
249c0 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
249d0 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
249e0 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72   might be overwr
249f0 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77  itten if the new
24a00 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20   template.** is 
24a10 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66  better and has f
24a20 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
24a30 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c  s.  Or the templ
24a40 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ate will be igno
24a50 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e  red.** and no in
24a60 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20  sert will occur 
24a70 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  if an existing W
24a80 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74  hereLoop is fast
24a90 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65  er and has.** fe
24aa0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
24ab0 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61   than the templa
24ac0 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  te.  Otherwise a
24ad0 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69   new WhereLoop i
24ae0 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64  s.** added based
24af0 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65   on the template
24b00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c  ..**.** If pBuil
24b10 64 65 72 2d 3e 70 42 65 73 74 20 69 73 20 6e 6f  der->pBest is no
24b20 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 6f  t NULL then we o
24b30 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74  nly care about t
24b40 68 65 20 76 65 72 79 0a 2a 2a 20 62 65 73 74 20  he very.** best 
24b50 74 65 6d 70 6c 61 74 65 20 61 6e 64 20 74 68 61  template and tha
24b60 74 20 74 65 6d 70 6c 61 74 65 20 73 68 6f 75 6c  t template shoul
24b70 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70  d be stored in p
24b80 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 2e 0a  Builder->pBest..
24b90 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  ** If pBuilder->
24ba0 70 42 65 73 74 20 69 73 20 4e 55 4c 4c 20 74 68  pBest is NULL th
24bb0 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65  en a list of the
24bc0 20 62 65 73 74 20 74 65 6d 70 6c 61 74 65 73 20   best templates 
24bd0 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
24be0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
24bf0 6f 2d 3e 70 4c 6f 6f 70 73 2e 0a 2a 2a 0a 2a 2a  o->pLoops..**.**
24c00 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69   When accumulati
24c10 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70  ng multiple loop
24c20 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72  s (when pBuilder
24c30 2d 3e 70 42 65 73 74 20 69 73 20 4e 55 4c 4c 29  ->pBest is NULL)
24c40 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67   we.** still mig
24c50 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d  ht overwrite sim
24c60 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20  ilar loops with 
24c70 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
24c80 20 69 66 20 74 68 65 0a 2a 2a 20 74 65 6d 70 6c   if the.** templ
24c90 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20 20  ate is better.  
24ca0 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65  Loops may be ove
24cb0 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
24cc0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f  following .** co
24cd0 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74  nditions are met
24ce0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
24cf0 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
24d00 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28  me iTab..**    (
24d10 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  2)  They have th
24d20 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e  e same iSortIdx.
24d30 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65 20  .**    (3)  The 
24d40 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d  template has sam
24d50 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e  e or fewer depen
24d60 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
24d70 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a   current loop.**
24d80 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65 6d      (4)  The tem
24d90 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73 61  plate has the sa
24da0 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74  me or lower cost
24db0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
24dc0 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 35 29  t loop.**    (5)
24dd0 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 75    The template u
24de0 73 65 73 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f  ses more terms o
24df0 66 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  f the same index
24e00 20 62 75 74 20 68 61 73 20 6e 6f 20 61 64 64 69   but has no addi
24e10 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  tional.**       
24e20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 20    dependencies  
24e30 20 20 20 20 20 20 20 20 0a 2a 2f 0a 73 74 61 74          .*/.stat
24e40 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
24e50 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70  Insert(WhereLoop
24e60 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
24e70 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  r, WhereLoop *pT
24e80 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72  emplate){.  Wher
24e90 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20  eLoop **ppPrev, 
24ea0 2a 70 2c 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a  *p, *pNext = 0;.
24eb0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
24ec0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
24ed0 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  pWInfo;.  sqlite
24ee0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
24ef0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
24f00 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70  * If pBuilder->p
24f10 42 65 73 74 20 69 73 20 64 65 66 69 6e 65 64 2c  Best is defined,
24f20 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20   then only keep 
24f30 74 72 61 63 6b 20 6f 66 20 74 68 65 20 73 69 6e  track of the sin
24f40 67 6c 65 0a 20 20 2a 2a 20 62 65 73 74 20 57 68  gle.  ** best Wh
24f50 65 72 65 4c 6f 6f 70 2e 20 20 70 42 75 69 6c 64  ereLoop.  pBuild
24f60 65 72 2d 3e 70 42 65 73 74 2d 3e 6d 61 73 6b 53  er->pBest->maskS
24f70 65 6c 66 3d 3d 30 20 69 6e 64 69 63 61 74 65 73  elf==0 indicates
24f80 20 74 68 61 74 20 6e 6f 0a 20 20 2a 2a 20 70 72   that no.  ** pr
24f90 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 68  ior WhereLoops h
24fa0 61 76 65 20 62 65 65 6e 20 65 76 61 6c 75 61 74  ave been evaluat
24fb0 65 64 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ed and that the 
24fc0 63 75 72 72 65 6e 74 20 70 54 65 6d 70 6c 61 74  current pTemplat
24fd0 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66  e.  ** is theref
24fe0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 61 6e  ore the first an
24ff0 64 20 68 65 6e 63 65 20 74 68 65 20 62 65 73 74  d hence the best
25000 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 72   and should be r
25010 65 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  etained..  */.  
25020 69 66 28 20 28 70 20 3d 20 70 42 75 69 6c 64 65  if( (p = pBuilde
25030 72 2d 3e 70 42 65 73 74 29 21 3d 30 20 29 7b 0a  r->pBest)!=0 ){.
25040 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 73 6b 53      if( p->maskS
25050 65 6c 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  elf!=0 ){.      
25060 57 68 65 72 65 43 6f 73 74 20 72 43 6f 73 74 20  WhereCost rCost 
25070 3d 20 70 2d 3e 72 52 75 6e 20 2b 20 70 2d 3e 72  = p->rRun + p->r
25080 53 65 74 75 70 3b 0a 20 20 20 20 20 20 57 68 65  Setup;.      Whe
25090 72 65 43 6f 73 74 20 72 54 65 6d 70 6c 61 74 65  reCost rTemplate
250a0 20 3d 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52   = pTemplate->rR
250b0 75 6e 20 2b 20 70 54 65 6d 70 6c 61 74 65 2d 3e  un + pTemplate->
250c0 72 53 65 74 75 70 3b 0a 20 20 20 20 20 20 69 66  rSetup;.      if
250d0 28 20 72 43 6f 73 74 20 3c 20 72 54 65 6d 70 6c  ( rCost < rTempl
250e0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ate ){.        g
250f0 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  oto whereLoopIns
25100 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20  ert_noop;.      
25110 7d 0a 20 20 20 20 20 20 69 66 28 20 72 43 6f 73  }.      if( rCos
25120 74 20 3d 3d 20 72 54 65 6d 70 6c 61 74 65 20 26  t == rTemplate &
25130 26 20 70 2d 3e 70 72 65 72 65 71 20 3c 3d 20 70  & p->prereq <= p
25140 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
25150 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
25160 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
25170 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  _noop;.      }. 
25180 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 4c 6f     }.    whereLo
25190 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54  opXfer(db, p, pT
251a0 65 6d 70 6c 61 74 65 29 3b 0a 23 69 66 20 57 48  emplate);.#if WH
251b0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
251c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
251d0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
251e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
251f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
25200 73 2d 62 65 73 74 3a 20 22 29 3b 0a 20 20 20 20  s-best: ");.    
25210 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
25220 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e  (pTemplate, pWIn
25230 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20  fo->pTabList);. 
25240 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
25250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25260 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72  ;.  }..  /* Sear
25270 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
25280 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  ng WhereLoop to 
25290 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68  overwrite, or wh
252a0 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70  ich takes.  ** p
252b0 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65  riority over pTe
252c0 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66  mplate..  */.  f
252d0 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66  or(ppPrev=&pWInf
252e0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70  o->pLoops, p=*pp
252f0 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d  Prev; p; ppPrev=
25300 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70  &p->pNextLoop, p
25310 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69  =*ppPrev){.    i
25320 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
25330 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70  plate->iTab || p
25340 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d  ->iSortIdx!=pTem
25350 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20  plate->iSortIdx 
25360 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25370 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
25380 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25390 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20  eq)==p->prereq. 
253a0 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
253b0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
253c0 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  tup.     && p->r
253d0 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
253e0 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  rRun.    ){.    
253f0 20 20 2f 2a 20 70 20 69 73 20 65 71 75 61 6c 20    /* p is equal 
25400 6f 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  or better than p
25410 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
25420 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c    if( p->nLTerm<
25430 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72  pTemplate->nLTer
25440 6d 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e  m.       && (p->
25450 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25460 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
25470 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
25480 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
25490 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
254a0 20 20 20 20 20 26 26 20 70 2d 3e 75 2e 62 74 72       && p->u.btr
254b0 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70  ee.pIndex==pTemp
254c0 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49  late->u.btree.pI
254d0 6e 64 65 78 0a 20 20 20 20 20 20 20 26 26 20 70  ndex.       && p
254e0 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c  ->prereq==pTempl
254f0 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ate->prereq.    
25500 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
25510 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69  Overwrite an exi
25520 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
25530 77 69 74 68 20 61 6e 20 73 69 6d 69 6c 61 72 20  with an similar 
25540 6f 6e 65 20 74 68 61 74 20 75 73 65 73 0a 20 20  one that uses.  
25550 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65        ** more te
25560 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
25570 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78   */.        pNex
25580 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  t = p->pNextLoop
25590 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
255a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
255b0 20 20 20 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61        /* pTempla
255c0 74 65 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75  te is not helpfu
255d0 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65  l..        ** Re
255e0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 63 68 61  turn without cha
255f0 6e 67 69 6e 67 20 6f 72 20 61 64 64 69 6e 67 20  nging or adding 
25600 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  anything */.    
25610 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f      goto whereLo
25620 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20  opInsert_noop;. 
25630 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
25640 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
25650 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
25660 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
25670 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26 20  >prereq.     && 
25680 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
25690 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20 20  late->rSetup.   
256a0 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54    && p->rRun>=pT
256b0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20  emplate->rRun.  
256c0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 76    ){.      /* Ov
256d0 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74  erwrite an exist
256e0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  ing WhereLoop wi
256f0 74 68 20 61 20 62 65 74 74 65 72 20 6f 6e 65 20  th a better one 
25700 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  */.      pNext =
25710 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
25720 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25730 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
25740 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
25750 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  nt it means that
25760 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75   either p[] shou
25770 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ld be overwritte
25780 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d  n.  ** with pTem
25790 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65  plate[] if p[] e
257a0 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d  xists, or if p==
257b0 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  NULL then alloca
257c0 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68  te a new.  ** Wh
257d0 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65  ereLoop and inse
257e0 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20  rt it..  */.#if 
257f0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
25800 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
25810 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
25820 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
25830 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25840 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
25850 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20  s-del:  ");.    
25860 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
25870 28 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  (p, pWInfo->pTab
25880 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
25890 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
258a0 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22  ntf("ins-new:  "
258b0 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
258c0 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
258d0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
258e0 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
258f0 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
25900 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
25910 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
25920 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
25930 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
25940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
25950 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  EM;.    whereLoo
25960 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20  pInit(p);.  }.  
25970 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62  whereLoopXfer(db
25980 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  , p, pTemplate);
25990 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20  .  p->pNextLoop 
259a0 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72  = pNext;.  *ppPr
259b0 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70  ev = p;.  if( (p
259c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
259d0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
259e0 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
259f0 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62  *pIndex = p->u.b
25a00 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
25a10 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
25a20 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29  Index->tnum==0 )
25a30 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
25a40 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
25a50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25a60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
25a70 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
25a80 74 68 65 20 69 6e 73 65 72 74 20 69 73 20 61 20  the insert is a 
25a90 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f  no-op */.whereLo
25aa0 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23  opInsert_noop:.#
25ab0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
25ac0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
25ad0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
25ae0 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  0x8 ){.    sqlit
25af0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
25b00 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20  ns-noop: ");.   
25b10 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
25b20 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66  pTemplate, pWInf
25b30 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  o->pTabList);.  
25b40 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
25b50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d  n SQLITE_OK;  .}
25b60 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20  ../*.** We have 
25b70 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70  so far matched p
25b80 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
25b90 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73  .btree.nEq terms
25ba0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 70 49   of the index pI
25bb0 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20  ndex..** Try to 
25bc0 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a  match one more..
25bd0 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d  **.** If pProbe-
25be0 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d  >tnum==0, that m
25bf0 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61  eans pIndex is a
25c00 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64   fake index used
25c10 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45   for the.** INTE
25c20 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
25c30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
25c40 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
25c50 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f  Index(.  WhereLo
25c60 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
25c70 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  der,     /* The 
25c80 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72  WhereLoop factor
25c90 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  y */.  struct Sr
25ca0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
25cb0 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  ,      /* FROM c
25cc0 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
25cd0 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
25ce0 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20  ndex *pProbe,   
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d00 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53  * An index on pS
25d10 72 63 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 4d  rc */.  int nInM
25d20 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ul              
25d30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
25d40 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20  r of iterations 
25d50 64 75 65 20 74 6f 20 49 4e 20 2a 2f 0a 29 7b 0a  due to IN */.){.
25d60 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
25d70 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
25d80 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52  pWInfo;  /* WHER
25d90 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78  E analyse contex
25da0 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
25db0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
25dc0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a  Parse;        /*
25dd0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
25de0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
25df0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
25e00 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
25e10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c  e connection mal
25e20 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  loc context */. 
25e30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
25e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25e50 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
25e60 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e  reLoop under con
25e70 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  struction */.  W
25e80 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
25e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ea0 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e  * A WhereTerm un
25eb0 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  der consideratio
25ec0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73  n */.  int opMas
25ed0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
25ee0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20         /* Valid 
25ef0 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f  operators for co
25f00 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57  nstraints */.  W
25f10 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20  hereScan scan;  
25f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25f30 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57  * Iterator for W
25f40 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20  HERE terms */.  
25f50 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72  Bitmask saved_pr
25f60 65 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20  ereq;           
25f70 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
25f80 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65  e of pNew->prere
25f90 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  q */.  u16 saved
25fa0 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20  _nLTerm;        
25fb0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
25fc0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
25fd0 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 69 6e  ->nLTerm */.  in
25fe0 74 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20  t saved_nEq;    
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26000 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
26010 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  of pNew->u.btree
26020 2e 6e 45 71 20 2a 2f 0a 20 20 75 33 32 20 73 61  .nEq */.  u32 sa
26030 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20  ved_wsFlags;    
26040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
26050 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
26060 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a  New->wsFlags */.
26070 20 20 57 68 65 72 65 43 6f 73 74 20 73 61 76 65    WhereCost save
26080 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  d_nOut;         
26090 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
260a0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
260b0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  t */.  int iCol;
260c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
260e0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  of the column in
260f0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
26100 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26110 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
26120 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
26130 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 52 6f 77  /.  tRowcnt iRow
26140 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Est;            
26150 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
26160 20 69 6e 64 65 78 20 73 65 6c 65 63 74 69 76 69   index selectivi
26170 74 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  ty */.  WhereCos
26180 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20  t rLogSize;     
26190 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
261a0 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69  ithm of table si
261b0 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ze */.  WhereTer
261c0 6d 20 2a 70 54 6f 70 2c 20 2a 70 42 74 6d 3b 20  m *pTop, *pBtm; 
261d0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 61          /* Top a
261e0 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20  nd bottom range 
261f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a  constraints */..
26200 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
26210 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64  r->pNew;.  if( d
26220 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26230 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
26240 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74  NOMEM;..  assert
26250 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
26260 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
26270 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
26280 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
26290 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65  tree.nEq<=pProbe
262a0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ->nColumn );.  a
262b0 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
262c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
262d0 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
262e0 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
262f0 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
26300 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
26310 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
26320 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
26330 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c  robe->tnum<=0 ||
26340 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65   (pSrc->jointype
26350 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
26360 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
26370 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54  O_EQ|WO_IN|WO_GT
26380 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
26390 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LE;.  }else{.   
263a0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
263b0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_IN|WO_ISNULL|
263c0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
263d0 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69  T|WO_LE;.  }.  i
263e0 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  f( pProbe->bUnor
263f0 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26  dered ) opMask &
26400 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  = ~(WO_GT|WO_GE|
26410 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20  WO_LT|WO_LE);.. 
26420 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72   if( pNew->u.btr
26430 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d  ee.nEq < pProbe-
26440 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
26450 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61  iCol = pProbe->a
26460 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e  iColumn[pNew->u.
26470 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20 20 20  btree.nEq];.    
26480 69 52 6f 77 45 73 74 20 3d 20 70 50 72 6f 62 65  iRowEst = pProbe
26490 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d  ->aiRowEst[pNew-
264a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d 3b  >u.btree.nEq+1];
264b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43  .  }else{.    iC
264c0 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 52 6f  ol = -1;.    iRo
264d0 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  wEst = 1;.  }.  
264e0 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
264f0 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75  nInit(&scan, pBu
26500 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63  ilder->pWC, pSrc
26510 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c  ->iCursor, iCol,
26520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26530 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c           opMask,
26540 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65   pProbe);.  save
26550 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e  d_nEq = pNew->u.
26560 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76  btree.nEq;.  sav
26570 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77  ed_nLTerm = pNew
26580 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65  ->nLTerm;.  save
26590 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77  d_wsFlags = pNew
265a0 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76  ->wsFlags;.  sav
265b0 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77  ed_prereq = pNew
265c0 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65  ->prereq;.  save
265d0 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e  d_nOut = pNew->n
265e0 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  Out;.  pNew->rSe
265f0 74 75 70 20 3d 20 28 57 68 65 72 65 43 6f 73 74  tup = (WhereCost
26600 29 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  )0;.  rLogSize =
26610 20 65 73 74 4c 6f 67 28 70 50 72 6f 62 65 2d 3e   estLog(pProbe->
26620 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20  aiRowEst[0]);.  
26630 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
26640 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b  _OK && pTerm!=0;
26650 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
26660 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a  anNext(&scan)){.
26670 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 31 3b      int nIn = 1;
26680 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
26690 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
266a0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
266b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 4e 65  ontinue;.    pNe
266c0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
266d0 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  ed_wsFlags;.    
266e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
266f0 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
26700 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
26710 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a  = saved_nLTerm;.
26720 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
26730 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
26740 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
26750 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f  ) ) break; /* OO
26760 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61  M */.    pNew->a
26770 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
26780 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm++] = pTerm;. 
26790 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
267a0 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20  = (saved_prereq 
267b0 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  | pTerm->prereqR
267c0 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d  ight) & ~pNew->m
267d0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65  askSelf;.    pNe
267e0 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69  w->rRun = rLogSi
267f0 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ze;.    if( pTer
26800 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
26810 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
26820 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
26830 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
26840 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
26850 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
26860 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
26870 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
26880 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
26890 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
268a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
268b0 29 22 3a 20 20 41 73 73 75 6d 65 20 74 68 65 20  )":  Assume the 
268c0 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32  SELECT returns 2
268d0 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  5 rows */.      
268e0 20 20 6e 49 6e 20 3d 20 32 35 3b 0a 20 20 20 20    nIn = 25;.    
268f0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
26900 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
26910 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
26920 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
26930 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
26940 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
26950 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
26960 6e 49 6e 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  nIn = pExpr->x.p
26970 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
26980 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
26990 3e 72 52 75 6e 20 2a 3d 20 6e 49 6e 3b 0a 20 20  >rRun *= nIn;.  
269a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
269b0 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70  e.nEq++;.      p
269c0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65  New->nOut = (Whe
269d0 72 65 43 6f 73 74 29 69 52 6f 77 45 73 74 20 2a  reCost)iRowEst *
269e0 20 6e 49 6e 4d 75 6c 20 2a 20 6e 49 6e 3b 0a 20   nInMul * nIn;. 
269f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
26a00 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
26a10 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20  (WO_EQ) ){.     
26a20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
26a30 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
26a40 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45  _COLUMN_NULL|WHE
26a50 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d  RE_COLUMN_IN))!=
26a60 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
26a70 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 31      || nInMul==1
26a80 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
26a90 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
26aa0 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
26ab0 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20    if( iCol<0  . 
26ac0 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65        || (pProbe
26ad0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
26ae0 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 31 0a  ne && nInMul==1.
26af0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4e             && pN
26b00 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  ew->u.btree.nEq=
26b10 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  =pProbe->nColumn
26b20 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  -1).      ){.   
26b30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26b40 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
26b50 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
26b60 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
26b70 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
26b80 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d  _ONEROW;.      }
26b90 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
26ba0 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
26bb0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 28    pNew->nOut = (
26bc0 57 68 65 72 65 43 6f 73 74 29 69 52 6f 77 45 73  WhereCost)iRowEs
26bd0 74 20 2a 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20  t * nInMul;.    
26be0 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
26bf0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
26c00 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  _ISNULL) ){.    
26c10 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
26c20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
26c30 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77  NULL;.      pNew
26c40 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
26c50 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 32 3b 20  .      nIn = 2; 
26c60 20 2f 2a 20 41 73 73 75 6d 65 20 49 53 20 4e 55   /* Assume IS NU
26c70 4c 4c 20 6d 61 74 63 68 65 73 20 74 77 6f 20 72  LL matches two r
26c80 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ows */.      pNe
26c90 77 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65 72 65  w->nOut = (Where
26ca0 43 6f 73 74 29 69 52 6f 77 45 73 74 20 2a 20 6e  Cost)iRowEst * n
26cb0 49 6e 4d 75 6c 20 2a 20 6e 49 6e 3b 0a 20 20 20  InMul * nIn;.   
26cc0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
26cd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
26ce0 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
26cf0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
26d00 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
26d10 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42  MN_RANGE|WHERE_B
26d20 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
26d30 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pBtm = pTerm;.  
26d40 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20      pTop = 0;.  
26d50 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
26d60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
26d70 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 7b 0a  WO_LT|WO_LE) ){.
26d80 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
26d90 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
26da0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
26db0 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
26dc0 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20   pTop = pTerm;. 
26dd0 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65       pBtm = (pNe
26de0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
26df0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30  RE_BTM_LIMIT)!=0
26e00 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
26e10 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
26e20 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
26e30 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a  m-2] : 0;.    }.
26e40 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
26e50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
26e60 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
26e70 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
26e80 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20  ut and rRun for 
26e90 53 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75  STAT3 range valu
26ea0 65 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72  es */.      Wher
26eb0 65 43 6f 73 74 20 72 44 69 76 3b 0a 20 20 20 20  eCost rDiv;.    
26ec0 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
26ed0 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
26ee0 62 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  be, pNew->u.btre
26ef0 65 2e 6e 45 71 2c 0a 20 20 20 20 20 20 20 20 20  e.nEq,.         
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
26f10 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72 44 69 76  Btm, pTop, &rDiv
26f20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
26f30 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
26f40 2f 72 44 69 76 3b 0a 20 20 20 20 7d 0a 23 69 66  /rDiv;.    }.#if
26f50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
26f60 45 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28 20  E_STAT3.    if( 
26f70 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
26f80 71 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d 3e  q==1 && pProbe->
26f90 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20  nSample ){.     
26fa0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
26fb0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
26fc0 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29  WO_ISNULL))!=0 )
26fd0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
26fe0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
26ff0 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c  (pParse, pProbe,
27000 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
27010 52 69 67 68 74 2c 0a 20 20 20 20 20 20 20 20 20  Right,.         
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27030 20 20 20 20 20 20 26 70 4e 65 77 2d 3e 6e 4f 75        &pNew->nOu
27040 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
27050 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
27060 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 0a 20  rator & WO_IN). 
27070 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 20              &&  
27080 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
27090 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
270a0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 20 29 7b  P_xIsSelect)  ){
270b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
270c0 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61  ereInScanEst(pPa
270d0 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 54 65  rse, pProbe, pTe
270e0 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rm->pExpr->x.pLi
270f0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27110 20 26 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 0a   &pNew->nOut);..
27120 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
27130 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65  ndif.    if( pNe
27140 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  w->wsFlags & (WH
27150 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
27160 52 45 5f 49 50 4b 29 20 29 7b 0a 20 20 20 20 20  RE_IPK) ){.     
27170 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 70   pNew->rRun += p
27180 4e 65 77 2d 3e 6e 4f 75 74 3b 20 20 2f 2a 20 55  New->nOut;  /* U
27190 6e 69 74 20 73 74 65 70 20 63 6f 73 74 20 74 6f  nit step cost to
271a0 20 72 65 61 63 68 20 65 61 63 68 20 72 6f 77 20   reach each row 
271b0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
271c0 20 20 20 20 2f 2a 20 45 61 63 68 20 72 6f 77 20      /* Each row 
271d0 69 6e 76 6f 6c 76 65 73 20 61 20 73 74 65 70 20  involves a step 
271e0 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  of the index, th
271f0 65 6e 20 61 20 62 69 6e 61 72 79 20 73 65 61 72  en a binary sear
27200 63 68 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ch of.      ** t
27210 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f  he main table */
27220 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
27230 6e 20 2b 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 2a  n += pNew->nOut*
27240 28 31 20 2b 20 72 4c 6f 67 53 69 7a 65 29 3b 0a  (1 + rLogSize);.
27250 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54 42 44      }.    /* TBD
27260 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 66 6f  : Adjust nOut fo
27270 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e  r additional con
27280 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
27290 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
272a0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
272b0 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 28 70  New);.    if( (p
272c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
272d0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
272e0 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d  =0.     && pNew-
272f0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
27300 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20  robe->nColumn.  
27310 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 7a 4e     && pProbe->zN
27320 61 6d 65 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  ame!=0.    ){.  
27330 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
27340 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
27350 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
27360 65 2c 20 6e 49 6e 4d 75 6c 2a 6e 49 6e 29 3b 0a  e, nInMul*nIn);.
27370 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
27380 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64  ->prereq = saved
27390 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d  _prereq;.  pNew-
273a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
273b0 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77  aved_nEq;.  pNew
273c0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
273d0 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
273e0 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
273f0 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
27400 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
27410 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  erm;.  return rc
27420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
27430 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20  n True if it is 
27440 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49  possible that pI
27450 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73  ndex might be us
27460 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65  eful in.** imple
27470 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
27480 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70  R BY clause in p
27490 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52  Builder..**.** R
274a0 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70  eturn False if p
274b0 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74  Builder does not
274c0 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45   contain an ORDE
274d0 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a  R BY clause or.*
274e0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * if there is no
274f0 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20   way for pIndex 
27500 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20  to be useful in 
27510 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61  implementing tha
27520 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  t.** ORDER BY cl
27530 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
27540 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65  int indexMightHe
27550 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20  lpWithOrderBy(. 
27560 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
27570 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49  r *pBuilder,.  I
27580 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20  ndex *pIndex,.  
27590 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20  int iCursor.){. 
275a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a   ExprList *pOB;.
275b0 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e    int iCol;.  in
275c0 74 20 69 69 3b 0a 0a 20 20 69 66 28 20 28 70 4f  t ii;..  if( (pO
275d0 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
275e0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
275f0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
27600 20 69 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e   iCol = pIndex->
27610 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3b 0a 20 20 66  aiColumn[0];.  f
27620 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d  or(ii=0; ii<pOB-
27630 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
27640 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
27650 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
27660 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69  Collate(pOB->a[i
27670 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
27680 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
27690 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
276a0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70   0;.    if( pExp
276b0 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73  r->iTable==iCurs
276c0 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  or ){.      if( 
276d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
276e0 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b  iCol ) return 1;
276f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
27700 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
27710 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
27720 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
27730 70 20 6f 62 6a 65 63 74 73 20 61 20 73 69 6e 67  p objects a sing
27740 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
27750 6a 6f 69 6e 20 77 65 72 65 20 74 68 65 20 74 61  join were the ta
27760 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69  ble.** is idenfi
27770 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
27780 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
27790 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
277a0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
277b0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
277c0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
277d0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
277e0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
277f0 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ree(.  WhereLoop
27800 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
27810 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  r, /* WHERE clau
27820 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
27830 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  /.  Bitmask mExt
27840 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
27850 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75  /* Extra prerequ
27860 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67  esites for using
27870 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
27880 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
27890 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
278a0 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
278b0 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  s context */.  I
278c0 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
278d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
278e0 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
278f0 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  aluating */.  In
27900 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20  dex sPk;        
27910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
27920 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ake index object
27930 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
27940 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e   key */.  tRowcn
27950 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b  t aiRowEstPk[2];
27960 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52        /* The aiR
27970 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f  owEst[] value fo
27980 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
27990 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d  */.  int aiColum
279a0 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  nPk = -1;       
279b0 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b   /* The aColumn[
279c0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
279d0 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53  sPk index */.  S
279e0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
279f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
27a00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
27a10 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
27a20 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f  t_item *pSrc;  /
27a30 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
27a40 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20  e btree term to 
27a50 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  add */.  WhereLo
27a60 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
27a70 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
27a80 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
27a90 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
27aa0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
27ab0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27ac0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  e */.  int iSort
27ad0 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20  Idx = 1;        
27ae0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62     /* Index numb
27af0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20  er */.  int b;  
27b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b10 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e      /* A boolean
27b20 20 76 61 6c 75 65 20 2a 2f 0a 20 20 57 68 65 72   value */.  Wher
27b30 65 43 6f 73 74 20 72 53 69 7a 65 3b 20 20 20 20  eCost rSize;    
27b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75             /* nu
27b50 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
27b60 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
27b70 68 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a  hereCost rLogSiz
27b80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
27b90 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
27ba0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
27bb0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
27bc0 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
27bd0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
27be0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
27bf0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
27c00 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
27c10 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
27c20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
27c30 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 61 73  pNew->iTab;.  as
27c40 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c  sert( !IsVirtual
27c50 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
27c60 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
27c70 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
27c80 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
27c90 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
27ca0 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
27cb0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
27cc0 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e  robe = pSrc->pIn
27cd0 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
27ce0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
27cf0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
27d00 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
27d10 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
27d20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
27d30 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
27d40 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
27d50 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
27d60 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
27d70 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
27d80 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
27d90 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
27da0 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
27db0 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
27dc0 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
27dd0 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
27de0 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e00 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
27e10 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
27e20 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
27e30 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
27e40 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
27e50 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
27e60 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
27e70 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
27e80 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73  .    sPk.aiRowEs
27e90 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
27ea0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
27eb0 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
27ec0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
27ed0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  Src->pTab;.    a
27ee0 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
27ef0 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  Src->pTab->nRowE
27f00 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  st;.    aiRowEst
27f10 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70  Pk[1] = 1;.    p
27f20 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
27f30 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
27f40 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
27f50 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
27f60 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64   /* The real ind
27f70 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
27f80 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  e are only consi
27f90 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20  dered if the.   
27fa0 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45     ** NOT INDEXE
27fb0 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f  D qualifier is o
27fc0 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
27fd0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
27fe0 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
27ff0 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
28000 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
28010 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20  ;.  }.  rSize = 
28020 28 57 68 65 72 65 43 6f 73 74 29 70 53 72 63 2d  (WhereCost)pSrc-
28030 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a  >pTab->nRowEst;.
28040 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
28050 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  Log(rSize);..  /
28060 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
28070 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  xes */.  if( !pB
28080 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 0a 20 20  uilder->pBest.  
28090 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   && pTabList->nS
280a0 72 63 3e 31 0a 20 20 20 26 26 20 28 70 57 49 6e  rc>1.   && (pWIn
280b0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  fo->pParse->db->
280c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41  flags & SQLITE_A
280d0 75 74 6f 49 6e 64 65 78 29 21 3d 30 20 0a 20 20  utoIndex)!=0 .  
280e0 20 26 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f   && !pSrc->viaCo
280f0 72 6f 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70  routine.   && !p
28100 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a  Src->notIndexed.
28110 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43     && !pSrc->isC
28120 6f 72 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20  orrelated.  ){. 
28130 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
28140 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c  uto-index WhereL
28150 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72  oops */.    Wher
28160 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70  eClause *pWC = p
28170 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
28180 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
28190 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  rm;.    WhereTer
281a0 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  m *pWCEnd = pWC-
281b0 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
281c0 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
281d0 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54  WC->a; rc==SQLIT
281e0 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57  E_OK && pTerm<pW
281f0 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
28200 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
28210 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
28220 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
28230 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
28240 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
28250 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
28260 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 0) ){.       
28270 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28280 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  Eq = 1;.        
28290 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
282a0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
282b0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
282c0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
282d0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
282e0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  erm;.        pNe
282f0 77 2d 3e 72 53 65 74 75 70 20 3d 20 32 30 2a 72  w->rSetup = 20*r
28300 4c 6f 67 53 69 7a 65 2a 70 53 72 63 2d 3e 70 54  LogSize*pSrc->pT
28310 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20  ab->nRowEst;.   
28320 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
28330 3d 20 28 57 68 65 72 65 43 6f 73 74 29 31 30 3b  = (WhereCost)10;
28340 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
28350 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b  Run = rLogSize +
28360 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20   pNew->nOut;.   
28370 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
28380 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs = WHERE_TEMP_
28390 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70  INDEX;.        p
283a0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
283b0 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72  xtra | pTerm->pr
283c0 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
283d0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
283e0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
283f0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
28400 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28410 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
28420 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f  ndices.  */.  fo
28430 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
28440 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72  K && pProbe; pPr
28450 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
28460 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a  t, iSortIdx++){.
28470 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
28480 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
28490 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
284a0 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74  .    pNew->iSort
284b0 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Idx = 0;.    pNe
284c0 77 2d 3e 72 53 65 74 75 70 20 3d 20 28 57 68 65  w->rSetup = (Whe
284d0 72 65 43 6f 73 74 29 30 3b 0a 20 20 20 20 70 4e  reCost)0;.    pN
284e0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
284f0 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  tra;.    pNew->u
28500 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
28510 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
28520 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
28530 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
28540 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
28550 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
28560 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
28570 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
28580 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
28590 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
285a0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
285b0 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
285c0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
285d0 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
285e0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
285f0 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
28600 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
28610 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
28620 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
28630 20 28 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69   (rSize + rLogSi
28640 7a 65 29 2a 28 33 2b 62 29 3b 20 2f 2a 20 34 78  ze)*(3+b); /* 4x
28650 20 70 65 6e 61 6c 74 79 20 66 6f 72 20 61 20 66   penalty for a f
28660 75 6c 6c 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 20  ull-scan */.    
28670 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
28680 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
28690 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   pNew);.      if
286a0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
286b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
286c0 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d  itmask m = pSrc-
286d0 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
286e0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
286f0 28 6a 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  (j=pProbe->nColu
28700 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  mn-1; j>=0; j--)
28710 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
28720 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
28730 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  mn[j];.        i
28740 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20  f( x<BMS-1 ){.  
28750 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 4d 41          m &= ~MA
28760 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 20 20  SKBIT(x);.      
28770 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28780 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28790 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
287a0 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
287b0 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
287c0 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20  E_INDEXED;..    
287d0 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
287e0 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
287f0 20 20 69 66 28 20 28 6d 3d 3d 30 20 7c 7c 20 62    if( (m==0 || b
28800 29 0a 20 20 20 20 20 20 20 26 26 20 70 50 72 6f  ).       && pPro
28810 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
28820 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 57 49  0.       && (pWI
28830 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
28840 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
28850 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
28860 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
28870 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
28880 73 0a 20 20 20 20 20 20 20 26 26 20 4f 70 74 69  s.       && Opti
28890 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
288a0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
288b0 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72  db, SQLITE_Cover
288c0 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 29  IdxScan).      )
288d0 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
288e0 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
288f0 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20  SortIdx : 0;.   
28900 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
28910 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  = rSize;.       
28920 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 28 6d   pNew->rRun = (m
28930 3d 3d 30 29 20 3f 20 28 72 53 69 7a 65 20 2b 20  ==0) ? (rSize + 
28940 72 4c 6f 67 53 69 7a 65 29 2a 28 31 2b 62 29 20  rLogSize)*(1+b) 
28950 3a 20 28 72 53 69 7a 65 2a 72 4c 6f 67 53 69 7a  : (rSize*rLogSiz
28960 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
28970 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
28980 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
28990 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
289a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
289b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  }.    }.    rc =
289c0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
289d0 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
289e0 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
289f0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  1);..    /* If t
28a00 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
28a10 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
28a20 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e  hen only that on
28a30 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a  e index is.    *
28a40 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f  * considered. */
28a50 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70  .    if( pSrc->p
28a60 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20  Index ) break;. 
28a70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28a80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
28a90 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
28aa0 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f  ts for a table o
28ab0 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74  f the join ident
28ac0 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69  ified by.** pBui
28ad0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
28ae0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
28af0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
28b00 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
28b10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
28b20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
28b30 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tual(.  WhereLoo
28b40 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
28b50 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  er,  /* WHERE cl
28b60 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
28b70 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
28b80 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
28b90 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72     /* Extra prer
28ba0 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73  equesites for us
28bb0 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a  ing this table *
28bc0 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
28bd0 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
28be0 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
28bf0 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
28c00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
28c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28c20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
28c30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
28c40 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
28c50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28c60 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
28c70 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
28c80 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
28c90 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
28ca0 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
28cb0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
28cc0 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
28cd0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
28ce0 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
28cf0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
28d00 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
28d10 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
28d20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
28d30 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
28d40 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
28d50 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
28d60 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
28d70 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54    int iTerm, mxT
28d80 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  erm;.  int nCons
28d90 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65  traint;.  int se
28da0 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  enIn = 0;       
28db0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28dc0 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
28dd0 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
28de0 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20  t seenVar = 0;  
28df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
28e00 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73  ue if a non-cons
28e10 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  tant constraint 
28e20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
28e30 20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20   iPhase;        
28e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
28e50 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a  const w/o IN, 1:
28e60 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e   const, 2: no IN
28e70 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68  ,  2: IN */.  Wh
28e80 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
28e90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28ea0 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d  _OK;..  pWInfo =
28eb0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
28ec0 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
28ed0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
28ee0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
28ef0 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
28f00 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d  r->pWC;.  pNew =
28f10 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
28f20 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66  .  pSrc = &pWInf
28f30 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
28f40 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54  New->iTab];.  pT
28f50 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
28f60 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
28f70 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20  tual(pTab) );.  
28f80 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63  pIdxInfo = alloc
28f90 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
28fa0 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
28fb0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72  pBuilder->pOrder
28fc0 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  By);.  if( pIdxI
28fd0 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
28fe0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28ff0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
29000 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
29010 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73   = 0;.  pNew->ws
29020 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
29030 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e  RTUALTABLE;.  pN
29040 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
29050 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
29060 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70  eedFree = 0;.  p
29070 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
29080 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
29090 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e  ge;.  nConstrain
290a0 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t = pIdxInfo->nC
290b0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
290c0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
290d0 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73  (db, pNew, nCons
290e0 74 72 61 69 6e 74 29 20 29 20 72 65 74 75 72 6e  traint) ) return
290f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
29100 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20    for(iPhase=0; 
29110 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73  iPhase<=3; iPhas
29120 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  e++){.    if( !s
29130 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65  eenIn && (iPhase
29140 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
29150 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20  iPhase++;.      
29160 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62  if( iPhase>3 ) b
29170 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
29180 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20  if( !seenVar && 
29190 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b  iPhase>1 ) break
291a0 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
291b0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
291c0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
291d0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
291e0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
291f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
29200 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
29210 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
29220 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  ++){.      j = p
29230 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
29240 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72  fset;.      pTer
29250 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
29260 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50        switch( iP
29270 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  hase ){.        
29280 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f  case 0:    /* Co
29290 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20  nstants without 
292a0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
292b0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
292c0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
292d0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
292e0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
292f0 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
29300 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e            seenIn
29310 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
29320 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
29330 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20  >prereqRight!=0 
29340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
29350 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20  eenVar = 1;.    
29360 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29370 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
29380 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
29390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
293a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
293b0 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f      case 1:    /
293c0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
293d0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f   IN operators */
293e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
293f0 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  t( seenIn );.   
29400 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
29410 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
29420 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30  ->prereqRight==0
29430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
29440 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
29450 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62   2:    /* Variab
29460 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a  les without IN *
29470 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
29480 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20  rt( seenVar );. 
29490 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
294a0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
294b0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
294c0 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20  WO_IN)==0;.     
294d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
294e0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f      default:   /
294f0 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
29500 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   IN */.         
29510 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72   assert( seenVar
29520 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20   && seenIn );.  
29530 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
29540 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
29550 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
29560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
29570 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
29580 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
29590 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e  [0])*pIdxInfo->n
295a0 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
295b0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
295c0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
295d0 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
295e0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
295f0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
29600 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
29610 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
29620 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
29630 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
29640 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
29650 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
29660 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
29670 20 2f 2a 20 28 28 57 68 65 72 65 43 6f 73 74 29   /* ((WhereCost)
29680 32 29 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51  2) In case of SQ
29690 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
296a0 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20  NG_POINT... */. 
296b0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
296c0 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
296d0 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28  ITE_BIG_DBL / ((
296e0 57 68 65 72 65 43 6f 73 74 29 32 29 3b 0a 20 20  WhereCost)2);.  
296f0 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49    rc = vtabBestI
29700 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61  ndex(pParse, pTa
29710 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
29720 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29730 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
29740 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43  _exit;.    pIdxC
29750 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
29760 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
29770 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
29780 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
29790 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
297a0 65 71 20 3d 20 30 3b 0a 20 20 20 20 6d 78 54 65  eq = 0;.    mxTe
297b0 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  rm = -1;.    ass
297c0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  ert( pNew->nLSlo
297d0 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  t>=nConstraint )
297e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
297f0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
29800 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  +) pNew->aLTerm[
29810 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  i] = 0;.    pNew
29820 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
29830 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  k = 0;.    for(i
29840 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
29850 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
29860 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
29870 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69  iTerm = pUsage[i
29880 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29  ].argvIndex - 1)
29890 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  >=0 ){.        j
298a0 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
298b0 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
298c0 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f    if( iTerm>=nCo
298d0 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20  nstraint.       
298e0 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20    || j<0.       
298f0 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65    || j>=pWC->nTe
29900 72 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  rm.         || p
29910 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
29920 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  m]!=0.        ){
29930 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
29940 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
29950 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29960 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
29970 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29  "%s.xBestIndex()
29980 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70   malfunction", p
29990 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
299a0 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
299b0 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
299c0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
299d0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
299e0 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  C->a[j];.       
299f0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
29a00 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
29a10 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
29a20 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d  ert( iTerm<pNew-
29a30 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
29a40 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
29a50 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a  iTerm] = pTerm;.
29a60 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
29a70 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72  m>mxTerm ) mxTer
29a80 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  m = iTerm;.     
29a90 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20     if( iTerm<16 
29aa0 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  && pUsage[i].omi
29ab0 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  t ) pNew->u.vtab
29ac0 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c  .omitMask |= 1<<
29ad0 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  iTerm;.        i
29ae0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
29af0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
29b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
29b10 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  ( pUsage[i].omit
29b20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
29b30 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74     /* Do not att
29b40 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49  empt to use an I
29b50 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20  N constraint if 
29b60 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
29b70 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
29b80 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65   says that the e
29b90 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e  quivalent EQ con
29ba0 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
29bb0 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64  e safely omitted
29bc0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
29bd0 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70   If we do attemp
29be0 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20  t to use such a 
29bf0 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65  constraint, some
29c00 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20   rows might be. 
29c10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
29c20 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75  peated in the ou
29c30 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tput. */.       
29c40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29c60 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74    /* A virtual t
29c70 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e  able that is con
29c80 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49  strained by an I
29c90 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74  N clause may not
29ca0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
29cb0 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20  nsume the ORDER 
29cc0 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73  BY clause becaus
29cd0 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20  e (1) the order 
29ce0 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20  of IN terms.    
29cf0 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
29d00 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61  necessarily rela
29d10 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72  ted to the order
29d20 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73   of output terms
29d30 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
29d40 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f  * (2) Multiple o
29d50 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69  utputs from a si
29d60 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69  ngle IN value wi
29d70 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20  ll not merge.   
29d80 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68         ** togeth
29d90 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  er.  */.        
29da0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
29db0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
29dc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29dd0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
29de0 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   i>=nConstraint 
29df0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
29e00 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31  LTerm = mxTerm+1
29e10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29e20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
29e30 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
29e40 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
29e50 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e  .idxNum = pIdxIn
29e60 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20  fo->idxNum;.    
29e70 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
29e80 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
29e90 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
29ea0 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78  xStr;.      pIdx
29eb0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
29ec0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
29ed0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
29ee0 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
29ef0 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20  ->idxStr;.      
29f00 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  pNew->u.vtab.isO
29f10 72 64 65 72 65 64 20 3d 20 28 75 38 29 28 28 70  rdered = (u8)((p
29f20 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
29f30 79 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  y!=0).          
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f50 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
29f60 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
29f70 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20  onsumed);.      
29f80 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 28  pNew->rSetup = (
29f90 57 68 65 72 65 43 6f 73 74 29 30 3b 0a 20 20 20  WhereCost)0;.   
29fa0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
29fb0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
29fc0 74 65 64 43 6f 73 74 3b 0a 20 20 20 20 20 20 70  tedCost;.      p
29fd0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65  New->nOut = (Whe
29fe0 72 65 43 6f 73 74 29 32 35 3b 0a 20 20 20 20 20  reCost)25;.     
29ff0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
2a000 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
2a010 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
2a020 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2a030 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
2a040 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
2a050 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
2a060 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
2a070 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2a080 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2a090 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f  .  }  ..whereLoo
2a0a0 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20  pAddVtab_exit:. 
2a0b0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
2a0c0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2a0d0 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
2a0e0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
2a0f0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2a100 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
2a110 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a120 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65  ./*.** Add Where
2a130 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20  Loop entries to 
2a140 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e  handle OR terms.
2a150 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72    This works for
2a160 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65   either.** btree
2a170 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62  s or virtual tab
2a180 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les..*/.static i
2a190 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f  nt whereLoopAddO
2a1a0 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  r(WhereLoopBuild
2a1b0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69  er *pBuilder, Bi
2a1c0 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20  tmask mExtra){. 
2a1d0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2a1e0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2a1f0 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c  WInfo;.  WhereCl
2a200 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
2a210 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
2a220 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2a230 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74  , *pWCEnd;.  int
2a240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a250 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57  .  int iCur;.  W
2a260 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
2a270 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  C;.  WhereLoopBu
2a280 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b  ilder sSubBuild;
2a290 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 73 42 65  .  WhereLoop sBe
2a2a0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
2a2b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2a2c0 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75  ;.  .  pWC = pBu
2a2d0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66  ilder->pWC;.  if
2a2e0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
2a2f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44  lags & WHERE_AND
2a300 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53  _ONLY ) return S
2a310 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45  QLITE_OK;.  pWCE
2a320 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
2a330 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77  C->nTerm;.  pNew
2a340 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2a350 77 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  w;..  for(pTerm=
2a360 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
2a370 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
2a380 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
2a390 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
2a3a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2a3b0 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
2a3c0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2a3d0 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
2a3e0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
2a3f0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
2a400 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
2a410 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
2a420 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
2a430 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
2a440 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
2a450 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
2a460 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
2a470 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2a480 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 57 68  OrTerm;.      Wh
2a490 65 72 65 43 6f 73 74 20 72 54 6f 74 61 6c 20 3d  ereCost rTotal =
2a4a0 20 30 3b 0a 20 20 20 20 20 20 57 68 65 72 65 43   0;.      WhereC
2a4b0 6f 73 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20  ost nRow = 0;.  
2a4c0 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
2a4d0 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
2a4e0 20 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f   .      whereLoo
2a4f0 70 49 6e 69 74 28 26 73 42 65 73 74 29 3b 0a 20  pInit(&sBest);. 
2a500 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70 57 49       pItem = pWI
2a510 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2a520 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
2a530 20 20 20 20 20 69 43 75 72 20 3d 20 70 49 74 65       iCur = pIte
2a540 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
2a550 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70    sSubBuild = *p
2a560 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73  Builder;.      s
2a570 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42  SubBuild.pOrderB
2a580 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75  y = 0;.      sSu
2a590 62 42 75 69 6c 64 2e 70 42 65 73 74 20 3d 20 26  bBuild.pBest = &
2a5a0 73 42 65 73 74 3b 0a 0a 20 20 20 20 20 20 66 6f  sBest;..      fo
2a5b0 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
2a5c0 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
2a5d0 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
2a5e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2a5f0 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
2a600 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
2a610 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
2a620 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
2a630 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
2a640 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
2a650 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
2a660 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
2a670 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
2a680 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
2a690 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
2a6a0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
2a6b0 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
2a6c0 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
2a6d0 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
2a6e0 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
2a6f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2a700 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
2a710 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
2a720 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
2a730 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
2a740 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2a750 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2a760 20 7d 0a 20 20 20 20 20 20 20 20 73 42 65 73 74   }.        sBest
2a770 2e 6d 61 73 6b 53 65 6c 66 20 3d 20 30 3b 0a 20  .maskSelf = 0;. 
2a780 20 20 20 20 20 20 20 73 42 65 73 74 2e 72 53 65         sBest.rSe
2a790 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tup = 0;.       
2a7a0 20 73 42 65 73 74 2e 72 52 75 6e 20 3d 20 30 3b   sBest.rRun = 0;
2a7b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
2a7c0 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
2a7d0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
2a7e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2a7f0 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42  ddVirtual(&sSubB
2a800 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
2a810 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a820 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2a830 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26  reLoopAddBtree(&
2a840 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
2a850 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
2a860 20 20 20 20 20 20 69 66 28 20 73 42 65 73 74 2e        if( sBest.
2a870 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29 20 62 72  maskSelf==0 ) br
2a880 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
2a890 65 72 74 28 20 73 42 65 73 74 2e 72 53 65 74 75  ert( sBest.rSetu
2a8a0 70 3d 3d 28 57 68 65 72 65 43 6f 73 74 29 30 20  p==(WhereCost)0 
2a8b0 29 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61  );.        rTota
2a8c0 6c 20 2b 3d 20 73 42 65 73 74 2e 72 52 75 6e 3b  l += sBest.rRun;
2a8d0 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  .        nRow +=
2a8e0 20 73 42 65 73 74 2e 6e 4f 75 74 3b 0a 20 20 20   sBest.nOut;.   
2a8f0 20 20 20 20 20 70 72 65 72 65 71 20 7c 3d 20 73       prereq |= s
2a900 42 65 73 74 2e 70 72 65 72 65 71 3b 0a 20 20 20  Best.prereq;.   
2a910 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2a920 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
2a930 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =1 );.      pNew
2a940 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
2a950 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2a960 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
2a970 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2a980 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
2a990 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  R;.      pNew->r
2a9a0 53 65 74 75 70 20 3d 20 28 57 68 65 72 65 43 6f  Setup = (WhereCo
2a9b0 73 74 29 30 3b 0a 20 20 20 20 20 20 70 4e 65 77  st)0;.      pNew
2a9c0 2d 3e 72 52 75 6e 20 3d 20 72 54 6f 74 61 6c 3b  ->rRun = rTotal;
2a9d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
2a9e0 74 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20  t = nRow;.      
2a9f0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 70  pNew->prereq = p
2aa00 72 65 72 65 71 3b 0a 20 20 20 20 20 20 6d 65 6d  rereq;.      mem
2aa10 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c  set(&pNew->u, 0,
2aa20 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29   sizeof(pNew->u)
2aa30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
2aa40 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2aa50 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2aa60 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c       whereLoopCl
2aa70 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ear(pWInfo->pPar
2aa80 73 65 2d 3e 64 62 2c 20 26 73 42 65 73 74 29 3b  se->db, &sBest);
2aa90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2aaa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2aab0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
2aac0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
2aad0 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74  ll tables .*/.st
2aae0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
2aaf0 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f  opAddAll(WhereLo
2ab00 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
2ab10 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
2ab20 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
2ab30 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2ab40 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d  Bitmask mExtra =
2ab50 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   0;.  Bitmask mP
2ab60 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rior = 0;.  int 
2ab70 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20  iTab;.  SrcList 
2ab80 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
2ab90 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
2aba0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2abb0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
2abc0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
2abd0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
2abe0 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d    int nTabList =
2abf0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
2ac00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ac10 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f  TE_OK;.  WhereLo
2ac20 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20  op *pNew;..  /* 
2ac30 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61  Loop over the ta
2ac40 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
2ac50 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
2ac60 69 67 68 74 20 2a 2f 0a 20 20 70 42 75 69 6c 64  ight */.  pBuild
2ac70 65 72 2d 3e 70 4e 65 77 20 3d 20 70 4e 65 77 20  er->pNew = pNew 
2ac80 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2ac90 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
2aca0 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
2acb0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
2acc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2acd0 4d 3b 0a 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72  M;.  pNew->aLTer
2ace0 6d 20 3d 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d  m = pNew->aLTerm
2acf0 53 70 61 63 65 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Space;.  pNew->n
2ad00 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
2ad10 65 28 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 53 70  e(pNew->aLTermSp
2ad20 61 63 65 29 3b 0a 20 20 66 6f 72 28 69 54 61 62  ace);.  for(iTab
2ad30 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69  =0, pItem=pTabLi
2ad40 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62  st->a; iTab<nTab
2ad50 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49  List; iTab++, pI
2ad60 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77  tem++){.    pNew
2ad70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ->iTab = iTab;. 
2ad80 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c     pNew->maskSel
2ad90 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49  f = getMask(&pWI
2ada0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
2adb0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2adc0 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e      if( (pItem->
2add0 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
2ade0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
2adf0 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72  0 ){.      mExtr
2ae00 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20  a = mPrior;.    
2ae10 7d 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  }.    if( IsVirt
2ae20 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
2ae30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
2ae40 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
2ae50 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  al(pBuilder, mEx
2ae60 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tra);.    }else{
2ae70 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2ae80 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42  eLoopAddBtree(pB
2ae90 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
2aea0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2aeb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2aec0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2aed0 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
2aee0 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
2aef0 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d   }.    mPrior |=
2af00 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b   pNew->maskSelf;
2af10 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64  .    if( rc || d
2af20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2af30 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77  ) break;.  }.  w
2af40 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
2af50 62 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  b, pBuilder->pNe
2af60 77 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  w);.  pBuilder->
2af70 70 4e 65 77 20 3d 20 30 3b 0a 20 20 72 65 74 75  pNew = 0;.  retu
2af80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2af90 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50  Examine a WhereP
2afa0 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64  ath (with the ad
2afb0 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78  dition of the ex
2afc0 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66  tra WhereLoop of
2afd0 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61   the 5th.** para
2afe0 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69  meters) to see i
2aff0 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77  f it outputs row
2b000 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  s in the request
2b010 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28  ed ORDER BY.** (
2b020 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74  or GROUP BY) wit
2b030 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61  hout requiring a
2b040 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65   separate source
2b050 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74   operation.  Ret
2b060 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30  urn:.** .**    0
2b070 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e  :  ORDER BY is n
2b080 6f 74 20 73 61 74 69 73 66 69 65 64 2e 20 20 53  ot satisfied.  S
2b090 6f 72 74 69 6e 67 20 72 65 71 75 69 72 65 64 0a  orting required.
2b0a0 2a 2a 20 20 20 20 31 3a 20 20 4f 52 44 45 52 20  **    1:  ORDER 
2b0b0 42 59 20 69 73 20 73 61 74 69 73 66 69 65 64 2e  BY is satisfied.
2b0c0 20 20 20 20 20 20 4f 6d 69 74 20 73 6f 72 74 69        Omit sorti
2b0d0 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b  ng.**   -1:  Unk
2b0e0 6e 6f 77 6e 20 61 74 20 74 68 69 73 20 74 69 6d  nown at this tim
2b0f0 65 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.**.*/.static i
2b100 6e 74 20 77 68 65 72 65 50 61 74 68 53 61 74 69  nt wherePathSati
2b110 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20  sfiesOrderBy(.  
2b120 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2b130 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  o,    /* The WHE
2b140 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
2b150 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
2b160 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
2b170 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a  ePath to check *
2b180 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 20  /.  int nLoop,  
2b190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2b1a0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2b1b0 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  n pPath->aLoop[]
2b1c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 61 73 74   */.  int isLast
2b1d0 4c 6f 6f 70 2c 20 20 20 20 20 20 20 2f 2a 20 54  Loop,       /* T
2b1e0 72 75 65 20 69 66 20 70 4c 61 73 74 20 69 73 20  rue if pLast is 
2b1f0 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c  the inner-most l
2b200 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  oop */.  WhereLo
2b210 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
2b220 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
2b230 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
2b240 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
2b250 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
2b260 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
2b270 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f  Mask of WhereLoo
2b280 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76  ps to run in rev
2b290 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b  erse order */.){
2b2a0 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20 20  .  u8 revSet;   
2b2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2b2c0 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e   if rev is known
2b2d0 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20   */.  u8 rev;   
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2b2f0 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72  omposite sort or
2b300 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49  der */.  u8 revI
2b310 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx;            /
2b320 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64  * Index sort ord
2b330 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64  er */.  u8 isOrd
2b340 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a  erDistinct;   /*
2b350 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65   All prior Where
2b360 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d  Loops are order-
2b370 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38  distinct */.  u8
2b380 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2b390 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
2b3a0 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51  he loop has UNIQ
2b3b0 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  UE NOT NULL colu
2b3c0 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61  mns */.  u8 isMa
2b3d0 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f  tch;           /
2b3e0 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65  * iColumn matche
2b3f0 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
2b400 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2b410 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e  */.  u16 nColumn
2b420 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
2b430 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2b440 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75  in pIndex */.  u
2b450 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  16 nOrderBy;    
2b460 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
2b470 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
2b480 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2b490 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
2b4a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2b4b0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20  of WhereLoop in 
2b4c0 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63  pPath being proc
2b4d0 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  essed */.  int i
2b4e0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2b4f0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2b500 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b520 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
2b530 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c  r current WhereL
2b540 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  oop */.  int iCo
2b550 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
2b560 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  * A column numbe
2b570 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69  r within table i
2b580 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  Cur */.  WhereLo
2b590 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 2f  op *pLoop;     /
2b5a0 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c  * Current WhereL
2b5b0 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73  oop being proces
2b5c0 73 65 64 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  sed. */.  ExprLi
2b5d0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
2b5e0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3b  WInfo->pOrderBy;
2b5f0 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
2b600 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
2b610 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
2b620 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
2b630 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
2b640 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2b650 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
2b660 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
2b670 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
2b680 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2b690 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
2b6a0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
2b6b0 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
2b6c0 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
2b6d0 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
2b6e0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
2b6f0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2b700 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
2b710 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
2b720 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
2b730 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
2b740 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
2b750 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
2b760 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
2b770 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
2b780 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
2b790 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
2b7a0 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
2b7b0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
2b7c0 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
2b7d0 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
2b7e0 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
2b7f0 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
2b800 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
2b810 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 0a 0a  ed loops */.  ..
2b820 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    /*.  ** We say
2b830 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
2b840 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69  s "one-row" if i
2b850 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d  t generates no m
2b860 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a  ore than one.  *
2b870 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  * row of output.
2b880 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73    A WhereLoop is
2b890 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20   one-row if all 
2b8a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2b8b0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20   are true:.  ** 
2b8c0 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63   (a) All index c
2b8d0 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74  olumns match wit
2b8e0 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  h WHERE_COLUMN_E
2b8f0 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65  Q..  **  (b) The
2b900 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65   index is unique
2b910 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c  .  ** Any WhereL
2b920 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52  oop with an WHER
2b930 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73  E_COLUMN_EQ cons
2b940 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f  traint on the ro
2b950 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a  wid is one-row..
2b960 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72    ** Every one-r
2b970 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c  ow WhereLoop wil
2b980 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45  l have the WHERE
2b990 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20  _ONEROW bit set 
2b9a0 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a  in wsFlags..  **
2b9b0 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65  .  ** We say the
2b9c0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f   WhereLoop is "o
2b9d0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69  rder-distinct" i
2b9e0 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c  f the set of col
2b9f0 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  umns from.  ** t
2ba00 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  hat WhereLoop th
2ba10 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52  at are in the OR
2ba20 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
2ba30 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  e different for 
2ba40 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  every.  ** row o
2ba50 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  f the WhereLoop.
2ba60 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20    Every one-row 
2ba70 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74  WhereLoop is aut
2ba80 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  omatically.  ** 
2ba90 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
2baa0 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68    A WhereLoop th
2bab0 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  at has no column
2bac0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
2bad0 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73  Y clause.  ** is
2bae0 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69   not order-disti
2baf0 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72  nct. To be order
2bb00 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74  -distinct is not
2bb10 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20   quite the same 
2bb20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e  as being.  ** UN
2bb30 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49  IQUE since a UNI
2bb40 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e  QUE column or in
2bb50 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  dex can have mul
2bb60 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20  tiple rows that 
2bb70 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61  .  ** are NULL a
2bb80 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  nd NULL values a
2bb90 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  re equivalent fo
2bba0 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66  r the purpose of
2bbb0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2bbc0 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65  .  ** To be orde
2bbd0 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20  r-distinct, the 
2bbe0 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20  columns must be 
2bbf0 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
2bc00 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ULL..  **.  ** T
2bc10 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74  he rowid for a t
2bc20 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55  able is always U
2bc30 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
2bc40 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74  LL so whenever t
2bc50 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70  he.  ** rowid ap
2bc60 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44  pears in the ORD
2bc70 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
2bc80 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2bc90 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a  WhereLoop is.  *
2bca0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2bcb0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
2bcc0 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20    */..  assert( 
2bcd0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a  pOrderBy!=0 );..
2bce0 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74 79    /* Sortability
2bcf0 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c   of virtual tabl
2bd00 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  es is determined
2bd10 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
2bd20 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f  ex method.  ** o
2bd30 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
2bd40 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20  ble itself */.  
2bd50 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61  if( pLast->wsFla
2bd60 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2bd70 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 74  ALTABLE ){.    t
2bd80 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30  estcase( nLoop>0
2bd90 20 29 3b 20 20 2f 2a 20 54 72 75 65 20 77 68 65   );  /* True whe
2bda0 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61 72  n outer loops ar
2bdb0 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61  e one-row and ma
2bdc0 74 63 68 20 0a 20 20 20 20 20 20 20 20 20 20 20  tch .           
2bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2bde0 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 74 65  * no ORDER BY te
2bdf0 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  rms */.    retur
2be00 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e  n pLast->u.vtab.
2be10 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20  isOrdered;.  }. 
2be20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70   if( nLoop && Op
2be30 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
2be40 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72  ed(db, SQLITE_Or
2be50 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20  derByIdxJoin) ) 
2be60 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72  return 0;..  nOr
2be70 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
2be80 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 6e  ->nExpr;.  if( n
2be90 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20  OrderBy>BMS-1 ) 
2bea0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
2beb0 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76  nnot optimize ov
2bec0 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52  erly large ORDER
2bed0 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65   BYs */.  isOrde
2bee0 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
2bef0 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49   obDone = MASKBI
2bf00 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20  T(nOrderBy)-1;. 
2bf10 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
2bf20 73 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c  sk = 0;.  for(iL
2bf30 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69  oop=0; isOrderDi
2bf40 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c  stinct && obSat<
2bf50 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c  obDone && iLoop<
2bf60 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  =nLoop; iLoop++)
2bf70 7b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  {.    pLoop = iL
2bf80 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
2bf90 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
2bfa0 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73  : pLast;.    ass
2bfb0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
2bfc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2bfd0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
2bfe0 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e  .    iCur = pWIn
2bff0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2c000 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75  pLoop->iTab].iCu
2c010 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70  rsor;.    if( (p
2c020 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c030 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
2c040 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
2c050 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2c060 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20  HERE_IPK ){.    
2c070 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
2c080 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2c090 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2c0a0 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
2c0b0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2c0c0 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
2c0d0 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
2c0e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2c0f0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2c100 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
2c110 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   = pIndex->nColu
2c120 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72  mn;.        isOr
2c130 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 70 49  derDistinct = pI
2c140 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
2c150 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  E_None;.      }.
2c160 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 76  .      /* For ev
2c170 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
2c180 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 6f  index that is co
2c190 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
2c1a0 6f 72 20 49 53 20 4e 55 4c 4c 2c 0a 20 20 20 20  or IS NULL,.    
2c1b0 20 20 2a 2a 20 6d 61 72 6b 20 6f 66 66 20 63 6f    ** mark off co
2c1c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 4f 52 44 45  rresponding ORDE
2c1d0 52 20 42 59 20 74 65 72 6d 73 20 77 68 65 72 65  R BY terms where
2c1e0 76 65 72 20 74 68 65 79 20 6f 63 63 75 72 0a 20  ver they occur. 
2c1f0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f       ** in the O
2c200 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
2c210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
2c220 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 6f 6f 70 2d  or(i=0; i<pLoop-
2c230 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 69 2b  >u.btree.nEq; i+
2c240 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
2c250 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
2c260 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
2c270 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2c280 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
2c290 49 53 4e 55 4c 4c 29 29 3d 3d 30 20 29 20 63 6f  ISNULL))==0 ) co
2c2a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2c2b0 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
2c2c0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
2c2d0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2c2e0 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 29  j<nOrderBy; j++)
2c2f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2c300 4d 41 53 4b 42 49 54 28 6a 29 20 26 20 6f 62 53  MASKBIT(j) & obS
2c310 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
2c320 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72           pOBExpr
2c330 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
2c340 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
2c350 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b  By->a[j].pExpr);
2c360 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2c370 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2c380 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2c390 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c3a0 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
2c3b0 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
2c3c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c3d0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
2c3e0 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  !=iColumn ) cont
2c3f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2c400 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  if( iColumn>=0 )
2c410 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
2c420 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2c430 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2c440 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
2c450 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a  y->a[j].pExpr);.
2c460 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c470 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2c480 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2c490 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c4a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2c4b0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  Coll->zName, pIn
2c4c0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 21  dex->azColl[i])!
2c4d0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2c4e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c4f0 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
2c500 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20  SKBIT(j);.      
2c510 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2c520 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20  obSat==obDone ) 
2c530 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2c540 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  }..      /* Loop
2c550 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c   through all col
2c560 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
2c570 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20  x and deal with 
2c580 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a  the ones.      *
2c590 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63  * that are not c
2c5a0 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
2c5b0 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f   or IN..      */
2c5c0 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76  .      rev = rev
2c5d0 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  Set = 0;.      d
2c5e0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
2c5f0 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
2c600 30 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a  0; j<=nColumn; j
2c610 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ++){.        u8 
2c620 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65  bOnce;   /* True
2c630 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
2c640 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
2c650 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
2c660 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64  Skip over == and
2c670 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a   IS NULL terms *
2c680 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  /.        if( j<
2c690 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2c6a0 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  Eq.         && (
2c6b0 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  (i = pLoop->aLTe
2c6c0 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72  rm[j]->eOperator
2c6d0 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  ) & (WO_EQ|WO_IS
2c6e0 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 20 20  NULL))!=0.      
2c6f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2c700 66 28 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  f( i & WO_ISNULL
2c710 20 29 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e   ) isOrderDistin
2c720 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2c730 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
2c740 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2c750 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
2c760 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
2c770 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
2c780 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
2c790 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
2c7a0 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
2c7b0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
2c7c0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
2c7d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 6e  .        if( j<n
2c7e0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2c7f0 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e      /* Normal in
2c800 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  dex columns */. 
2c810 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
2c820 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
2c830 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
2c840 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65    revIdx = pInde
2c850 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  x->aSortOrder[j]
2c860 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c870 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
2c880 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
2c890 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
2c8a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c8b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 52          /* The R
2c8c0 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 61 74 20 74  OWID column at t
2c8d0 68 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20  he end */.      
2c8e0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
2c8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
2c900 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
2c910 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
2c920 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63   unconstrained c
2c930 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74  olumn that might
2c940 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74   be NULL means t
2c950 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20  hat this.       
2c960 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73   ** WhereLoop is
2c970 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65   not well-ordere
2c980 64 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d .        */.  
2c990 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
2c9a0 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20  rDistinct.      
2c9b0 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30     && iColumn>=0
2c9c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d  .         && j>=
2c9d0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2c9e0 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
2c9f0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61  Index->pTable->a
2ca00 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
2ca10 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  Null==0.        
2ca20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
2ca30 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
2ca40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2ca50 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65       /* Find the
2ca60 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
2ca70 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
2ca80 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  to the j-th colu
2ca90 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  mn.        ** of
2caa0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 61   the index and a
2cab0 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44  nd mark that ORD
2cac0 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a  ER BY term off .
2cad0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2cae0 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20     bOnce = 1;.  
2caf0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
2cb00 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
2cb10 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e  =0; bOnce && i<n
2cb20 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
2cb30 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53           if( MAS
2cb40 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
2cb50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2cb60 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
2cb70 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
2cb80 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
2cb90 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2cba0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49          if( (pWI
2cbb0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2cbc0 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29  & WHERE_GROUPBY)
2cbd0 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b  ==0 ) bOnce = 0;
2cbe0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2cbf0 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2cc00 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2cc10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2cc20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
2cc30 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
2cc40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2cc50 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
2cc60 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  !=iColumn ) cont
2cc70 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2cc80 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  if( iColumn>=0 )
2cc90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
2cca0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2ccb0 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2ccc0 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
2ccd0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2cce0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ccf0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2cd00 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cd20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2cd30 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  Coll->zName, pIn
2cd40 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21  dex->azColl[j])!
2cd50 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2cd60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cd70 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31       isMatch = 1
2cd80 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2cd90 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2cda0 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
2cdb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2cdc0 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 64 69  ( iColumn<0 ) di
2cdd0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
2cde0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  1;.          obS
2cdf0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
2ce00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ce10 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2ce20 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
2ce30 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PBY)==0 ){.     
2ce40 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
2ce50 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
2ce60 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
2ce70 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
2ce80 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
2ce90 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
2cea0 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
2ceb0 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
2cec0 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
2ced0 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
2cee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cef0 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76    if( (rev ^ rev
2cf00 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e  Idx)!=pOrderBy->
2cf10 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
2cf20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2cf30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2cf40 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
2cf50 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
2cf60 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
2cf70 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
2cf80 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
2cf90 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
2cfa0 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
2cfb0 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
2cfc0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2cfd0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2cfe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cff0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74         /* No mat
2d000 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ch found */.    
2d010 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c        if( j==0 |
2d020 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 20 69 73  | j<nColumn ) is
2d030 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2d040 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
2d050 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2d060 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f      } /* end Loo
2d070 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78  p over all index
2d080 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
2d090 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f    if( distinctCo
2d0a0 6c 75 6d 6e 73 20 29 20 69 73 4f 72 64 65 72 44  lumns ) isOrderD
2d0b0 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
2d0c0 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
2d0d0 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
2d0e0 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
2d0f0 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
2d100 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
2d110 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
2d120 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
2d130 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
2d140 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2d150 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
2d160 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
2d170 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
2d180 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
2d190 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69  pr *p;.        i
2d1a0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2d1b0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2d1c0 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f  ;.        p = pO
2d1d0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2d1e0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
2d1f0 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
2d200 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
2d210 74 2c 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74  t, p)&~orderDist
2d220 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a  inctMask)==0 ){.
2d230 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
2d240 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2d250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d260 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2d270 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
2d280 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
2d290 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
2d2a0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
2d2b0 69 66 28 20 69 73 4c 61 73 74 4c 6f 6f 70 20 29  if( isLastLoop )
2d2c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
2d2d0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65  urn -1;.}..#ifde
2d2e0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2d2f0 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
2d300 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
2d310 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2d320 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
2d330 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
2d340 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
2d350 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
2d360 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
2d370 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
2d380 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
2d390 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
2d3a0 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
2d3b0 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
2d3c0 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
2d3d0 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
2d3e0 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
2d3f0 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
2d400 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
2d410 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  if.../*.** Given
2d420 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
2d430 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 6f  reLoop objects o
2d440 6e 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  n pWInfo->pLoops
2d450 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
2d460 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  * attempts to fi
2d470 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
2d480 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73  st path that vis
2d490 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f  its each WhereLo
2d4a0 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69  op.** once.  Thi
2d4b0 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c  s path is then l
2d4c0 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70  oaded into the p
2d4d0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f  WInfo->a[].pWLoo
2d4e0 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  p fields..**.** 
2d4f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2d500 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
2d510 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
2d520 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2d530 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
2d540 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
2d550 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
2d560 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
2d570 6e 66 6f 2c 20 57 68 65 72 65 43 6f 73 74 20 6e  nfo, WhereCost n
2d580 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
2d590 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
2d5a0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2d5b0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
2d5c0 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
2d5d0 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
2d5e0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
2d5f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d600 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
2d610 69 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  in */.  sqlite3 
2d620 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
2d630 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
2d640 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
2d650 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
2d660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2d670 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72  oop counter over
2d680 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
2d690 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  e join */.  int 
2d6a0 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20  ii, jj;         
2d6b0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2d6c0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
2d6d0 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20 20 20  eCost rCost;    
2d6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
2d6f0 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20   of a path */.  
2d700 57 68 65 72 65 43 6f 73 74 20 6d 78 43 6f 73 74  WhereCost mxCost
2d710 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2d720 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
2d730 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
2d740 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 53  /.  WhereCost rS
2d750 6f 72 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20  ortCost;        
2d760 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f 20 61   /* Cost to do a
2d770 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e   sort */.  int n
2d780 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20  To, nFrom;      
2d790 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d7a0 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20  f valid entries 
2d7b0 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72  in aTo[] and aFr
2d7c0 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50  om[] */.  WhereP
2d7d0 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20  ath *aFrom;     
2d7e0 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d      /* All nFrom
2d7f0 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72   paths at the pr
2d800 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a  evious level */.
2d810 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f    WherePath *aTo
2d820 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2d830 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68  he nTo best path
2d840 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  s at the current
2d850 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
2d860 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20  ePath *pFrom;   
2d870 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
2d880 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74  ent of aFrom[] t
2d890 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
2d8a0 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
2d8b0 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20  Path *pTo;      
2d8c0 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
2d8d0 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74  nt of aTo[] that
2d8e0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
2d8f0 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  on */.  WhereLoo
2d900 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20  p *pWLoop;      
2d910 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
2d920 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2d930 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  s */.  WhereLoop
2d940 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20   **pX;          
2d950 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79   /* Used to divy
2d960 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d   up the pSpace m
2d970 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72 20  emory */.  char 
2d980 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
2d990 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
2d9a0 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  y memory used by
2d9b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
2d9c0 0a 0a 20 20 64 62 20 3d 20 70 57 49 6e 66 6f 2d  ..  db = pWInfo-
2d9d0 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e  >pParse->db;.  n
2d9e0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
2d9f0 4c 65 76 65 6c 3b 0a 20 20 6d 78 43 68 6f 69 63  Level;.  mxChoic
2da00 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f  e = (nLoop==1) ?
2da10 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f   1 : (nLoop==2 ?
2da20 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65   5 : 10);.  asse
2da30 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66  rt( nLoop<=pWInf
2da40 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
2da50 63 20 29 3b 0a 23 69 66 64 65 66 20 57 48 45 52  c );.#ifdef WHER
2da60 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
2da70 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2da80 65 54 72 61 63 65 3e 3d 32 20 29 20 73 71 6c 69  eTrace>=2 ) sqli
2da90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2daa0 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65  ---- begin solve
2dab0 72 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  r\n");.#endif.. 
2dac0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
2dad0 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
2dae0 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46  e for aTo and aF
2daf0 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73  rom */.  ii = (s
2db00 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29  izeof(WherePath)
2db10 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f  +sizeof(WhereLoo
2db20 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  p*)*nLoop)*mxCho
2db30 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20  ice*2;.  pSpace 
2db40 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2db50 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20  cRaw(db, ii);.  
2db60 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20  if( pSpace==0 ) 
2db70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2db80 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68  MEM;.  aTo = (Wh
2db90 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b  erePath*)pSpace;
2dba0 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d  .  aFrom = aTo+m
2dbb0 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65  xChoice;.  memse
2dbc0 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65  t(aFrom, 0, size
2dbd0 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20  of(aFrom[0]));. 
2dbe0 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70   pX = (WhereLoop
2dbf0 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69  **)(aFrom+mxChoi
2dc00 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78  ce);.  for(ii=mx
2dc10 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d  Choice*2, pFrom=
2dc20 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c  aTo; ii>0; ii--,
2dc30 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20   pFrom++, pX += 
2dc40 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f  nLoop){.    pFro
2dc50 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20  m->aLoop = pX;. 
2dc60 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68   }..  /* Seed th
2dc70 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
2dc80 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
2dc90 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
2dca0 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
2dcb0 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d   aFrom[0].nRow =
2dcc0 20 28 57 68 65 72 65 43 6f 73 74 29 31 3b 0a 20   (WhereCost)1;. 
2dcd0 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f   nFrom = 1;..  /
2dce0 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65  * Precompute the
2dcf0 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
2dd00 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
2dd10 74 20 73 65 74 2c 20 69 66 20 74 68 65 20 63 61  t set, if the ca
2dd20 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  ller.  ** to sql
2dd30 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2dd40 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61   was concerned a
2dd50 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a  bout sorting */.
2dd60 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 28 57    rSortCost = (W
2dd70 68 65 72 65 43 6f 73 74 29 30 3b 0a 20 20 69 66  hereCost)0;.  if
2dd80 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
2dd90 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
2dda0 3c 3d 30 2e 30 20 29 7b 0a 20 20 20 20 61 46 72  <=0.0 ){.    aFr
2ddb0 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56  om[0].isOrderedV
2ddc0 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  alid = 1;.  }els
2ddd0 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  e{.    /* Comput
2dde0 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 6e  e an estimate on
2ddf0 20 74 68 65 20 63 6f 73 74 20 74 6f 20 73 6f 72   the cost to sor
2de00 74 20 74 68 65 20 65 6e 74 69 72 65 20 72 65 73  t the entire res
2de10 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 72  ult set */.    r
2de20 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45  SortCost = nRowE
2de30 73 74 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73  st*estLog(nRowEs
2de40 74 29 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45  t);.#ifdef WHERE
2de50 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2de60 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2de70 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20  reTrace>=2 ){.  
2de80 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2de90 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 73 6f 72  Printf("---- sor
2dea0 74 20 63 6f 73 74 3d 25 2d 37 2e 32 67 5c 6e 22  t cost=%-7.2g\n"
2deb0 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20  , rSortCost);.  
2dec0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
2ded0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63    /* Compute suc
2dee0 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72  cessively longer
2def0 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e   WherePaths usin
2df00 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67  g the previous g
2df10 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f  eneration.  ** o
2df20 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20  f WherePaths as 
2df30 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68  the basis for th
2df40 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72  e next.  Keep tr
2df50 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  ack of the mxCho
2df60 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61  ice.  ** best pa
2df70 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65  ths at each gene
2df80 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  ration */.  for(
2df90 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
2dfa0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
2dfb0 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20      nTo = 0;.   
2dfc0 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d   for(ii=0, pFrom
2dfd0 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d  =aFrom; ii<nFrom
2dfe0 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  ; ii++, pFrom++)
2dff0 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f  {.      for(pWLo
2e000 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  op=pWInfo->pLoop
2e010 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f  s; pWLoop; pWLoo
2e020 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c  p=pWLoop->pNextL
2e030 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69  oop){.        Bi
2e040 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20  tmask maskNew;. 
2e050 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72         Bitmask r
2e060 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
2e070 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64      u8 isOrdered
2e080 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  Valid = pFrom->i
2e090 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20  sOrderedValid;. 
2e0a0 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
2e0b0 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
2e0c0 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
2e0d0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
2e0e0 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
2e0f0 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
2e100 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
2e110 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
2e120 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
2e130 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
2e140 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
2e150 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
2e160 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
2e170 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
2e180 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
2e190 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
2e1a0 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
2e1b0 20 20 20 20 72 43 6f 73 74 20 3d 20 70 57 4c 6f      rCost = pWLo
2e1c0 6f 70 2d 3e 72 53 65 74 75 70 20 2b 20 70 57 4c  op->rSetup + pWL
2e1d0 6f 6f 70 2d 3e 72 52 75 6e 2a 70 46 72 6f 6d 2d  oop->rRun*pFrom-
2e1e0 3e 6e 52 6f 77 20 2b 20 70 46 72 6f 6d 2d 3e 72  >nRow + pFrom->r
2e1f0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6d 61  Cost;.        ma
2e200 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d  skNew = pFrom->m
2e210 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
2e220 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2e230 20 20 20 20 69 66 28 20 21 69 73 4f 72 64 65 72      if( !isOrder
2e240 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  edValid ){.     
2e250 20 20 20 20 20 73 77 69 74 63 68 28 20 77 68 65       switch( whe
2e260 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
2e270 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
2e280 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 69 4c 6f  From, iLoop, iLo
2e290 6f 70 3d 3d 6e 4c 6f 6f 70 2d 31 2c 0a 20 20 20  op==nLoop-1,.   
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2c0 20 20 20 20 20 20 20 20 20 70 57 4c 6f 6f 70 2c           pWLoop,
2e2d0 20 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20   &revMask) ){.  
2e2e0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 31            case 1
2e2f0 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f  :  /* Yes.  pFro
2e300 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61  m+pWLoop does sa
2e310 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
2e320 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
2e330 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2e340 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ered = 1;.      
2e350 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2e360 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  dValid = 1;.    
2e370 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2e380 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
2e390 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46  e 0:  /* No.  pF
2e3a0 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20  rom+pWLoop will 
2e3b0 72 65 71 75 69 72 65 20 61 20 73 65 70 61 72 61  require a separa
2e3c0 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20  te sort */.     
2e3d0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2e3e0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
2e3f0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
2e400 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
2e410 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 2b 3d          rCost +=
2e420 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 20 20   rSortCost;.    
2e430 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2e440 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66  .            def
2e450 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20  ault: /* Cannot 
2e460 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79 20 61  tell yet.  Try a
2e470 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65 78 74  gain on the next
2e480 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
2e490 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2e4a0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
2e4b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e4c0 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20          revMask 
2e4d0 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
2e4e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e4f0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
2e500 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68  see if pWLoop sh
2e510 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f  ould be added to
2e520 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62 65   the mxChoice be
2e530 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
2e540 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70       for(jj=0, p
2e550 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20  To=aTo; jj<nTo; 
2e560 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
2e570 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
2e580 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e  >maskLoop==maskN
2e590 65 77 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64  ew && pTo->isOrd
2e5a0 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64  eredValid==isOrd
2e5b0 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20  eredValid ){.   
2e5c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2e5d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2e5f0 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20  ( jj>=nTo ){.   
2e600 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
2e610 6d 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73  mxChoice && rCos
2e620 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66  t>=mxCost ){.#if
2e630 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2e640 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20  NABLED.         
2e650 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2e660 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2e680 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2e690 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74  ("Skip   %s cost
2e6a0 3d 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25 63  =%-7.2g order=%c
2e6b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2e6c0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
2e6d0 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
2e6e0 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
2e6f0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2e700 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
2e710 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
2e720 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
2e730 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
2e740 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2e750 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2e760 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e770 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
2e780 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68 65 20  new Path to the 
2e790 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20  aTo[] set */.   
2e7a0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d         if( nTo<m
2e7b0 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
2e7c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
2e7d0 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
2e7e0 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e  he aTo set by on
2e7f0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
2e800 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20   jj = nTo++;.   
2e810 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2e830 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74   path replaces t
2e840 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74  he prior worst t
2e850 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c  o keep count bel
2e860 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20  ow mxChoice */. 
2e870 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
2e880 6a 3d 6e 54 6f 2d 31 3b 20 61 54 6f 5b 6a 6a 5d  j=nTo-1; aTo[jj]
2e890 2e 72 43 6f 73 74 3c 6d 78 43 6f 73 74 3b 20 6a  .rCost<mxCost; j
2e8a0 6a 2d 2d 29 7b 20 61 73 73 65 72 74 28 6a 6a 3e  j--){ assert(jj>
2e8b0 30 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  0); }.          
2e8c0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
2e8d0 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
2e8e0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2e8f0 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
2e900 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2e910 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
2e920 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e930 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77  DebugPrintf("New
2e940 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e      %s cost=%-7.
2e950 32 67 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  2g order=%c\n",.
2e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e970 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
2e980 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
2e990 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20  op), rCost,.    
2e9a0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2e9b0 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
2e9c0 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
2e9d0 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
2e9e0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2e9f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ea00 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
2ea10 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 29  ->rCost<=rCost )
2ea20 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
2ea30 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2ea40 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2ea50 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
2ea60 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
2ea70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2ea80 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
2ea90 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20           "Skip  
2eaa0 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e 32 67 20   %s cost=%-7.2g 
2eab0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
2eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2ead0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
2eae0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
2eaf0 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20  , rCost,.       
2eb00 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2eb10 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
2eb20 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
2eb30 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
2eb40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2eb50 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
2eb60 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 37 2e   vs %s cost=%-7.
2eb70 32 67 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  2g order=%c\n",.
2eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb90 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
2eba0 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
2ebb0 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20  , pTo->rCost,.  
2ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebd0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
2ebe0 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  lid ? (pTo->isOr
2ebf0 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
2ec00 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
2ec10 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2ec30 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2ec40 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
2ec50 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65 72 20   new and better 
2ec60 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72 65 76  score for a prev
2ec70 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20 65  iously created e
2ec80 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68 20 2a  quivalent path *
2ec90 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
2eca0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2ecb0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2ecc0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
2ecd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2ece0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2ecf0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
2ed00 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f     "Update %s co
2ed10 73 74 3d 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d  st=%-7.2g order=
2ed20 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
2ed30 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
2ed40 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
2ed50 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
2ed60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ed70 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
2ed80 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
2ed90 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
2eda0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2edb0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2edc0 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
2edd0 25 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25 63 5c  %-7.2g order=%c\
2ede0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2edf0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2ee00 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
2ee10 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a  0), pTo->rCost,.
2ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee30 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
2ee40 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  lid ? (pTo->isOr
2ee50 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
2ee60 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
2ee70 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2ee80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ee90 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77  /* pWLoop is a w
2eea0 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74  inner.  Add it t
2eeb0 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73  o the set of bes
2eec0 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  t so far */.    
2eed0 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f      pTo->maskLoo
2eee0 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  p = pFrom->maskL
2eef0 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
2ef00 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
2ef10 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72  pTo->revLoop = r
2ef20 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  evMask;.        
2ef30 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46 72 6f  pTo->nRow = pFro
2ef40 6d 2d 3e 6e 52 6f 77 20 2a 20 70 57 4c 6f 6f 70  m->nRow * pWLoop
2ef50 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ->nOut;.        
2ef60 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f  pTo->rCost = rCo
2ef70 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  st;.        pTo-
2ef80 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
2ef90 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  = isOrderedValid
2efa0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69  ;.        pTo->i
2efb0 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64  sOrdered = isOrd
2efc0 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65  ered;.        me
2efd0 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c  mcpy(pTo->aLoop,
2efe0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73   pFrom->aLoop, s
2eff0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
2f000 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  )*iLoop);.      
2f010 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f    pTo->aLoop[iLo
2f020 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20  op] = pWLoop;.  
2f030 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
2f040 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
2f050 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54       mxCost = aT
2f060 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20  o[0].rCost;.    
2f070 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20        for(jj=1, 
2f080 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c  pTo=&aTo[1]; jj<
2f090 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20  mxChoice; jj++, 
2f0a0 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
2f0b0 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
2f0c0 73 74 3e 6d 78 43 6f 73 74 20 29 20 6d 78 43 6f  st>mxCost ) mxCo
2f0d0 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b  st = pTo->rCost;
2f0e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f0f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f100 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45     }..#ifdef WHE
2f110 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
2f120 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2f130 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a  hereTrace>=2 ){.
2f140 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2f150 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61  ugPrintf("---- a
2f160 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d  fter round %d --
2f170 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20  --\n", iLoop);. 
2f180 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70       for(ii=0, p
2f190 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20  To=aTo; ii<nTo; 
2f1a0 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  ii++, pTo++){.  
2f1b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2f1c0 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f  ugPrintf(" %s co
2f1d0 73 74 3d 25 2d 37 2e 32 67 20 6e 72 6f 77 3d 25  st=%-7.2g nrow=%
2f1e0 2d 37 2e 32 67 20 6f 72 64 65 72 3d 25 63 22 2c  -7.2g order=%c",
2f1f0 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
2f200 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
2f210 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
2f220 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
2f230 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
2f240 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
2f250 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  d ? (pTo->isOrde
2f260 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
2f270 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2f280 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65   if( pTo->isOrde
2f290 72 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d  redValid && pTo-
2f2a0 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20  >isOrdered ){.  
2f2b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2f2c0 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76  ebugPrintf(" rev
2f2d0 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d  =0x%llx\n", pTo-
2f2e0 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  >revLoop);.     
2f2f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f300 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2f310 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
2f320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f330 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2f340 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f    /* Swap the ro
2f350 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64  les of aFrom and
2f360 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78   aTo for the nex
2f370 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  t generation */.
2f380 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b      pFrom = aTo;
2f390 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d  .    aTo = aFrom
2f3a0 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46  ;.    aFrom = pF
2f3b0 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d  rom;.    nFrom =
2f3c0 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   nTo;.  }..  if(
2f3d0 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20   nFrom==0 ){.   
2f3e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2f3f0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
2f400 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74   "no query solut
2f410 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ion");.    sqlit
2f420 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70  e3DbFree(db, pSp
2f430 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ace);.    return
2f440 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2f450 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20   }.  .  /* Find 
2f460 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
2f470 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c  path.  pFrom wil
2f480 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
2f490 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20  ng to that path 
2f4a0 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72  */.  pFrom = aFr
2f4b0 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20  om;.  for(ii=1; 
2f4c0 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
2f4d0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
2f4e0 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
2f4f0 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
2f500 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
2f510 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
2f520 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
2f530 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
2f540 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
2f550 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
2f560 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
2f570 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
2f580 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
2f590 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
2f5a0 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
2f5b0 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
2f5c0 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
2f5d0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
2f5e0 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
2f5f0 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
2f600 2d 3e 69 54 61 62 3b 20 2f 2a 20 46 49 58 4d 45  ->iTab; /* FIXME
2f610 3a 20 4f 6d 69 74 20 74 68 65 20 69 46 72 6f 6d  : Omit the iFrom
2f620 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 70 4c   field */.    pL
2f630 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
2f640 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2f650 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2f660 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a  m].iCursor;.  }.
2f670 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
2f680 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 70 57  rdered ){.    pW
2f690 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
2f6a0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
2f6b0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 57 49 6e  >nExpr;.    pWIn
2f6c0 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46  fo->revMask = pF
2f6d0 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
2f6e0 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  }.  pWInfo->nRow
2f6f0 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
2f700 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65  w;..  /* Free te
2f710 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61  mporary memory a
2f720 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  nd return succes
2f730 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62  s */.  sqlite3Db
2f740 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
2f750 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2f760 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
2f770 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
2f780 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
2f790 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
2f7a0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2f7b0 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
2f7c0 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
2f7d0 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
2f7e0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
2f7f0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
2f800 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
2f810 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
2f820 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
2f830 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
2f840 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
2f850 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
2f860 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
2f870 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
2f880 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
2f890 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
2f8a0 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
2f8b0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2f8c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2f8d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
2f8e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2f8f0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
2f900 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
2f910 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
2f920 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
2f930 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
2f940 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
2f950 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
2f960 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
2f970 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
2f980 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
2f990 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
2f9a0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
2f9b0 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
2f9c0 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
2f9d0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
2f9e0 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
2f9f0 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
2fa00 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
2fa10 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
2fa20 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
2fa30 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
2fa40 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
2fa50 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
2fa60 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
2fa70 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
2fa80 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
2fa90 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
2faa0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
2fab0 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
2fac0 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
2fad0 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
2fae0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
2faf0 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
2fb00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
2fb10 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
2fb20 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
2fb30 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
2fb40 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
2fb50 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
2fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2fb70 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
2fb80 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
2fb90 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
2fba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
2fbb0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
2fbc0 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
2fbd0 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
2fbe0 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
2fbf0 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
2fc00 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2fc10 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
2fc20 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
2fc30 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
2fc40 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
2fc50 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
2fc60 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
2fc70 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
2fc80 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
2fc90 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
2fca0 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
2fcb0 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
2fcc0 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
2fcd0 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
2fce0 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
2fcf0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
2fd00 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
2fd10 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
2fd20 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
2fd30 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
2fd40 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
2fd50 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
2fd60 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
2fd70 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
2fd80 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
2fd90 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
2fda0 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
2fdb0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
2fdc0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
2fdd0 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
2fde0 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
2fdf0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2fe00 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
2fe10 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
2fe20 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
2fe30 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
2fe40 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
2fe50 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
2fe60 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
2fe70 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
2fe80 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
2fe90 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
2fea0 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
2feb0 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
2fec0 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
2fed0 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
2fee0 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
2fef0 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
2ff00 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
2ff10 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
2ff20 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
2ff30 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2ff40 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
2ff50 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
2ff60 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
2ff70 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
2ff80 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
2ff90 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
2ffa0 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
2ffb0 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
2ffc0 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
2ffd0 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
2ffe0 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
2fff0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
30000 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
30010 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
30020 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
30030 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
30040 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
30050 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
30060 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
30070 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
30080 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
30090 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
300a0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
300b0 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
300c0 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
300d0 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
300e0 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
300f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
30100 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
30110 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
30120 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
30130 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
30140 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
30150 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
30160 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
30170 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
30180 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
30190 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
301a0 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
301b0 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
301c0 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
301d0 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
301e0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
301f0 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
30200 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
30210 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
30220 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
30230 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
30240 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
30250 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
30260 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
30270 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
30280 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
30290 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
302a0 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
302b0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
302c0 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
302d0 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
302e0 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
302f0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
30300 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
30310 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
30320 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
30330 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
30340 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
30350 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
30360 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
30370 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
30380 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
30390 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
303a0 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
303b0 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
303c0 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
303d0 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  SSING.**.** pOrd
303e0 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
303f0 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
30400 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  Y clause of a SE
30410 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a  LECT statement,.
30420 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
30430 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
30440 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
30450 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
30460 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
30470 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
30480 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
30490 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72  tement, then pOr
304a0 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
304b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78  *.** If an index
304c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20   can be used so 
304d0 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c  that the natural
304e0 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66   output order of
304f0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63   the table.** sc
30500 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f  an is correct fo
30510 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
30520 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74  lause, then that
30530 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61   index is used a
30540 6e 64 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  nd.** the return
30550 65 64 20 57 68 65 72 65 49 6e 66 6f 2e 6e 4f 42  ed WhereInfo.nOB
30560 53 61 74 20 66 69 65 6c 64 20 69 73 20 73 65 74  Sat field is set
30570 20 74 6f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45   to pOrderBy->nE
30580 78 70 72 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  xpr.  This.** is
30590 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
305a0 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61   that prevents a
305b0 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f  n unnecessary so
305c0 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
305d0 20 73 65 74 0a 2a 2a 20 69 66 20 61 6e 20 69 6e   set.** if an in
305e0 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20  dex appropriate 
305f0 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
30600 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
30610 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  exists..**.** If
30620 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   the where claus
30630 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62  e loops cannot b
30640 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72  e arranged to pr
30650 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63  ovide the correc
30660 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65  t.** output orde
30670 72 2c 20 74 68 65 6e 20 57 68 65 72 65 49 6e 66  r, then WhereInf
30680 6f 2e 6e 4f 42 53 61 74 20 69 73 20 30 2e 0a 2a  o.nOBSat is 0..*
30690 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
306a0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
306b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
306c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
306d0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
306e0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
306f0 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69  List,    /* A li
30700 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
30710 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
30720 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
30730 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
30740 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
30750 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
30760 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f  derBy,   /* An O
30770 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
30780 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  or NULL */.  Exp
30790 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
307a0 2c 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74  ,  /* The select
307b0 2d 6c 69 73 74 20 66 6f 72 20 44 49 53 54 49 4e  -list for DISTIN
307c0 43 54 20 71 75 65 72 69 65 73 20 2d 20 6f 72 20  CT queries - or 
307d0 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63  NULL */.  u16 wc
307e0 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
307f0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
30800 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
30810 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
30820 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  .h */.  int iIdx
30830 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur           /*
30840 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   If WHERE_ONETAB
30850 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
30860 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d  index cursor num
30870 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ber */.){.  int 
30880 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20  nByteWInfo;     
30890 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62         /* Num. b
308a0 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
308b0 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  or WhereInfo str
308c0 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  uct */.  int nTa
308d0 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
308e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
308f0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61   elements in pTa
30900 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
30910 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
30920 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
30930 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
30940 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
30950 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
30960 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
30970 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
30980 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
30990 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
309a0 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
309b0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
309c0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
309d0 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
309e0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
309f0 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20  er sWLB;     /* 
30a00 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75  The WhereLoop bu
30a10 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  ilder */.  Where
30a20 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
30a30 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
30a40 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
30a50 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
30a60 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
30a70 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
30a80 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b  el in pWInfo->a[
30a90 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  ] */.  int ii;  
30aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ab0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
30ac0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
30ad0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
30ae0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
30af0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
30b00 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
30b10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
30b20 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f  rn code */...  /
30b30 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69  * Variable initi
30b40 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 6d  alization */.  m
30b50 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20  emset(&sWLB, 0, 
30b60 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20  sizeof(sWLB));. 
30b70 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d   sWLB.pOrderBy =
30b80 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
30b90 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
30ba0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
30bb0 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
30bc0 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
30bd0 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
30be0 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
30bf0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  /.  testcase( pT
30c00 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d  abList->nSrc==BM
30c10 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c  S );.  if( pTabL
30c20 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
30c30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
30c40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
30c50 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
30c60 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
30c70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
30c80 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66    }..  /* This f
30c90 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79  unction normally
30ca0 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73   generates a nes
30cb0 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c  ted loop for all
30cc0 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a   tables in .  **
30cd0 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20   pTabList.  But 
30ce0 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  if the WHERE_ONE
30cf0 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
30d00 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20  is set, then we 
30d10 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79  should.  ** only
30d20 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   generate code f
30d30 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62  or the first tab
30d40 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61  le in pTabList a
30d50 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20  nd assume that. 
30d60 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20   ** any cursors 
30d70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
30d80 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65  subsequent table
30d90 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69  s are uninitiali
30da0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62  zed..  */.  nTab
30db0 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61  List = (wctrlFla
30dc0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
30dd0 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20  BLE_ONLY) ? 1 : 
30de0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a  pTabList->nSrc;.
30df0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
30e00 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
30e10 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
30e20 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
30e30 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20  become the.  ** 
30e40 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20  return value. A 
30e50 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
30e60 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  n is used to sto
30e70 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  re the WhereInfo
30e80 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68  .  ** struct, th
30e90 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68  e contents of Wh
30ea0 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65  ereInfo.a[], the
30eb0 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
30ec0 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20  ucture.  ** and 
30ed0 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  the WhereMaskSet
30ee0 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63   structure. Sinc
30ef0 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f  e WhereClause co
30f00 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65  ntains an 8-byte
30f10 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70  .  ** field (typ
30f20 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75  e Bitmask) it mu
30f30 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e  st be aligned on
30f40 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
30f50 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ary on.  ** some
30f60 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20   architectures. 
30f70 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38  Hence the ROUND8
30f80 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  () below..  */. 
30f90 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
30fa0 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d  ;.  nByteWInfo =
30fb0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57   ROUND8(sizeof(W
30fc0 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c  hereInfo)+(nTabL
30fd0 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  ist-1)*sizeof(Wh
30fe0 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57  ereLevel));.  pW
30ff0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
31000 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
31010 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 69 66  ByteWInfo);.  if
31020 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
31030 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
31040 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
31050 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  fo);.    pWInfo 
31060 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68  = 0;.    goto wh
31070 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
31080 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   }.  pWInfo->nLe
31090 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a  vel = nTabList;.
310a0 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
310b0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
310c0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
310d0 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
310e0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
310f0 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66  OrderBy;.  pWInf
31100 6f 2d 3e 70 44 69 73 74 69 6e 63 74 20 3d 20 70  o->pDistinct = p
31110 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 57 49 6e  Distinct;.  pWIn
31120 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
31130 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
31140 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
31150 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
31160 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
31170 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
31180 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
31190 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b  eryLoop;.  pMask
311a0 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  Set = &pWInfo->s
311b0 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e  MaskSet;.  sWLB.
311c0 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b  pWInfo = pWInfo;
311d0 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70  .  sWLB.pWC = &p
311e0 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 0a 20 20 2f  WInfo->sWC;..  /
311f0 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
31200 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
31210 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
31220 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
31230 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
31240 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
31250 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
31260 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
31270 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
31280 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
31290 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
312a0 4f 70 74 29 20 29 20 70 44 69 73 74 69 6e 63 74  Opt) ) pDistinct
312b0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69   = 0;..  /* Spli
312c0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
312d0 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
312e0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
312f0 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
31300 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
31310 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
31320 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
31330 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
31340 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77  t(pMaskSet);.  w
31350 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
31360 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49  pWInfo->sWC, pWI
31370 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  nfo);.  sqlite3E
31380 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
31390 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29  (pParse, pWhere)
313a0 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26  ;.  whereSplit(&
313b0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68  pWInfo->sWC, pWh
313c0 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20  ere, TK_AND);   
313d0 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d  /* IMP: R-15842-
313e0 35 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20  53296 */.    .  
313f0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
31400 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
31410 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
31420 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
31430 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
31440 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
31450 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
31460 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
31470 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  u..  */.  if( pW
31480 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73  here && (nTabLis
31490 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  t==0 || sqlite3E
314a0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
314b0 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
314c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
314d0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
314e0 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
314f0 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a  iBreak, SQLITE_J
31500 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
31510 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
31520 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
31530 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
31540 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
31550 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
31560 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
31570 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62  When assigning b
31580 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f  itmask values to
31590 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72   FROM clause cur
315a0 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65  sors, it must be
315b0 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74  .  ** the case t
315c0 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20  hat if X is the 
315d0 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
315e0 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65  N-th FROM clause
315f0 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20   term then.  ** 
31600 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
31610 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
31620 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66  terms to the lef
31630 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65  t of the N-th te
31640 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29  rm.  ** is (X-1)
31650 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f  .   An expressio
31660 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  n from the ON cl
31670 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
31680 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  OIN can use.  **
31690 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74   its Expr.iRight
316a0 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20  JoinTable value 
316b0 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d  to find the bitm
316c0 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74  ask of the right
316d0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74   table.  ** of t
316e0 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61  he join.  Subtra
316f0 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74  cting one from t
31700 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62  he right table b
31710 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20  itmask gives a. 
31720 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20   ** bitmask for 
31730 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
31740 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
31750 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65  in.  Knowing the
31760 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f   bitmask.  ** fo
31770 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
31780 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
31790 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72  ft join is impor
317a0 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
317b0 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  015..  **.  ** N
317c0 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
317d0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
317e0 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
317f0 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
31800 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
31810 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
31820 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
31830 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
31840 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
31850 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
31860 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
31870 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
31880 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
31890 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
318a0 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
318b0 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
318c0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
318d0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  ; ii++){.    cre
318e0 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
318f0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
31900 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ].iCursor);.  }.
31910 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
31920 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74   {.    Bitmask t
31930 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20  oTheLeft = 0;.  
31940 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
31950 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
31960 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i++){.      Bitm
31970 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28  ask m = getMask(
31980 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
31990 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
319a0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
319b0 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65  ( (m-1)==toTheLe
319c0 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68  ft );.      toTh
319d0 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20  eLeft |= m;.    
319e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
319f0 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
31a00 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
31a10 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
31a20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
31a30 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
31a40 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
31a50 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
31a60 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
31a70 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
31a80 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
31a90 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
31aa0 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
31ab0 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
31ac0 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
31ad0 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
31ae0 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72  at the added vir
31af0 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e  tual terms are n
31b00 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a  ever processed..
31b10 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79    */.  exprAnaly
31b20 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
31b30 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
31b40 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
31b50 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
31b60 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
31b70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  r;.  }..  /* Che
31b80 63 6b 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ck if the DISTIN
31b90 43 54 20 71 75 61 6c 69 66 69 65 72 2c 20 69 66  CT qualifier, if
31ba0 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2c 20 69   there is one, i
31bb0 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 0a 20 20  s redundant. .  
31bc0 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
31bd0 6e 20 73 65 74 20 70 44 69 73 74 69 6e 63 74 20  n set pDistinct 
31be0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 57 68 65 72  to NULL and Wher
31bf0 65 49 6e 66 6f 2e 65 44 69 73 74 69 6e 63 74 20  eInfo.eDistinct 
31c00 74 6f 0a 20 20 2a 2a 20 57 48 45 52 45 5f 44 49  to.  ** WHERE_DI
31c10 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20 74 6f  STINCT_UNIQUE to
31c20 20 74 65 6c 6c 20 74 68 65 20 63 61 6c 6c 65 72   tell the caller
31c30 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 44   to ignore the D
31c40 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20 20  ISTINCT..  */.  
31c50 69 66 28 20 70 44 69 73 74 69 6e 63 74 20 26 26  if( pDistinct &&
31c60 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
31c70 64 61 6e 74 28 70 50 61 72 73 65 2c 70 54 61 62  dant(pParse,pTab
31c80 4c 69 73 74 2c 26 70 57 49 6e 66 6f 2d 3e 73 57  List,&pWInfo->sW
31c90 43 2c 70 44 69 73 74 69 6e 63 74 29 20 29 7b 0a  C,pDistinct) ){.
31ca0 20 20 20 20 70 44 69 73 74 69 6e 63 74 20 3d 20      pDistinct = 
31cb0 30 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  0;.    pWInfo->e
31cc0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
31cd0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
31ce0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  ;.  }..  /* Cons
31cf0 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65 4c  truct the WhereL
31d00 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
31d10 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
31d20 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72  * Optimizer Star
31d30 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 72 63  t ***\n"));.  rc
31d40 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41   = whereLoopAddA
31d50 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 69 66 28  ll(&sWLB);.  if(
31d60 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65   rc ) goto where
31d70 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
31d80 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66  * Display all of
31d90 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
31da0 62 6a 65 63 74 73 20 69 66 20 77 68 65 72 65 74  bjects if wheret
31db0 72 61 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20  race is enabled 
31dc0 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
31dd0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
31de0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
31df0 72 61 63 65 20 29 7b 0a 20 20 20 20 57 68 65 72  race ){.    Wher
31e00 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 69 6e  eLoop *p;.    in
31e10 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 73 74 61  t i = 0;.    sta
31e20 74 69 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b  tic char zLabel[
31e30 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61  ] = "0123456789a
31e40 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
31e50 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20  rstuvwyxz".     
31e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e80 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
31e90 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20  PQRSTUVWYXZ";.  
31ea0 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e    for(p=pWInfo->
31eb0 70 4c 6f 6f 70 73 3b 20 70 3b 20 70 3d 70 2d 3e  pLoops; p; p=p->
31ec0 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20  pNextLoop){.    
31ed0 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65    p->cId = zLabe
31ee0 6c 5b 28 69 2b 2b 29 25 73 69 7a 65 6f 66 28 7a  l[(i++)%sizeof(z
31ef0 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 77  Label)];.      w
31f00 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
31f10 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20   pTabList);.    
31f20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
31f30 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
31f40 70 57 49 6e 66 6f 2c 20 2d 31 29 3b 0a 20 20 69  pWInfo, -1);.  i
31f50 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
31f60 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
31f70 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 69 66  BeginError;.  if
31f80 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
31f90 42 79 20 29 7b 0a 20 20 20 20 20 77 68 65 72 65  By ){.     where
31fa0 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
31fb0 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  o, pWInfo->nRowO
31fc0 75 74 29 3b 0a 20 20 20 20 20 69 66 28 20 64 62  ut);.     if( db
31fd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
31fe0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
31ff0 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 20 69  Error;.  }else i
32000 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
32010 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
32020 65 72 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66  er ){.     pWInf
32030 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69  o->revMask = (Bi
32040 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a  tmask)(-1);.  }.
32050 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
32060 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
32070 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
32080 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
32090 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57  or;.  }.#ifdef W
320a0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
320b0 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
320c0 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
320d0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c   int ii;.    sql
320e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
320f0 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 22 29  "---- Solution")
32100 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
32110 2d 3e 6e 4f 42 53 61 74 20 29 7b 0a 20 20 20 20  ->nOBSat ){.    
32120 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
32130 69 6e 74 66 28 22 20 4f 52 44 45 52 20 42 59 20  intf(" ORDER BY 
32140 6f 6d 69 74 74 65 64 20 72 65 76 3d 30 78 25 6c  omitted rev=0x%l
32150 6c 78 5c 6e 22 2c 20 70 57 49 6e 66 6f 2d 3e 72  lx\n", pWInfo->r
32160 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  evMask);.    }el
32170 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
32180 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
32190 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ");.    }.    fo
321a0 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c  r(ii=0; ii<nTabL
321b0 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ist; ii++){.    
321c0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
321d0 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70  (pWInfo->a[ii].p
321e0 57 4c 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29  WLoop, pTabList)
321f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
32200 69 66 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  if.  WHERETRACE(
32210 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
32220 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
32230 29 3b 0a 0a 23 69 66 20 30 20 20 2f 2a 20 46 49  );..#if 0  /* FI
32240 58 4d 45 3a 20 41 64 64 20 74 68 69 73 20 62 61  XME: Add this ba
32250 63 6b 20 69 6e 3f 20 2a 2f 0a 20 20 2f 2a 20 49  ck in? */.  /* I
32260 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
32270 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
32280 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ETE statement th
32290 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  at is requesting
322a0 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f  .  ** to use a o
322b0 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
322c0 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  m, determine if 
322d0 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69  this is appropri
322e0 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e  ate..  ** The on
322f0 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
32300 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74   only works if t
32310 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
32320 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
32330 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
32340 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c  o update a singl
32350 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73  e row..  */.  as
32360 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67  sert( (wctrlFlag
32370 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
32380 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
32390 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
323a0 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74  =1 );.  if( (wct
323b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
323c0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
323d0 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73  !=0 && (andFlags
323e0 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
323f0 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66  !=0 ){.    pWInf
32400 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31  o->okOnePass = 1
32410 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
32420 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  0].plan.wsFlags 
32430 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e  &= ~WHERE_IDX_ON
32440 4c 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  LY;.  }.#endif..
32450 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
32460 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
32470 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
32480 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
32490 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
324a0 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
324b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
324c0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
324d0 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e  arse, -1); /* In
324e0 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  sert the cookie 
324f0 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f  verifier Goto */
32500 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
32510 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49  Bitmask)0;.  pWI
32520 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28  nfo->nRowOut = (
32530 57 68 65 72 65 43 6f 73 74 29 31 3b 0a 20 20 66  WhereCost)1;.  f
32540 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  or(ii=0, pLevel=
32550 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54  pWInfo->a; ii<nT
32560 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c  abList; ii++, pL
32570 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
32580 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
32590 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
325a0 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
325b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
325c0 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
325d0 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
325e0 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ex */.    struct
325f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
32600 54 61 62 49 74 65 6d 3b 0a 20 20 20 20 57 68 65  TabItem;.    Whe
32610 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 0a  reLoop *pLoop;..
32620 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
32630 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
32640 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
32650 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
32660 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d  >pTab;.    iDb =
32670 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
32680 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
32690 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c  pSchema);.    pL
326a0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
326b0 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70  Loop;.    if( (p
326c0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
326d0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
326e0 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
326f0 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t ){.      /* Do
32700 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
32710 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  }else.#ifndef SQ
32720 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
32730 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28  LTABLE.    if( (
32740 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
32750 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
32760 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
32770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54   const char *pVT
32780 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ab = (const char
32790 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61   *)sqlite3GetVTa
327a0 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
327b0 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20       int iCur = 
327c0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
327d0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
327e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
327f0 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c  _VOpen, iCur, 0,
32800 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54   0, pVTab, P4_VT
32810 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  AB);.    }else i
32820 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
32830 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  b) ){.      /* n
32840 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  oop */.    }else
32850 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
32860 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
32870 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
32880 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
32890 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
328a0 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
328b0 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LOSE)==0 ){.    
328c0 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66    int op = pWInf
328d0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f  o->okOnePass ? O
328e0 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50  P_OpenWrite : OP
328f0 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
32900 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
32910 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  e(pParse, pTabIt
32920 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62  em->iCursor, iDb
32930 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20  , pTab, op);.   
32940 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61     testcase( pTa
32950 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  b->nCol==BMS-1 )
32960 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
32970 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  ( pTab->nCol==BM
32980 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  S );.      if( !
32990 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
329a0 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c  s && pTab->nCol<
329b0 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42  BMS ){.        B
329c0 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49  itmask b = pTabI
329d0 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
329e0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
329f0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62  .        for(; b
32a00 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d  ; b=b>>1, n++){}
32a10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32a20 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
32a30 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
32a40 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20  ntAddr(v)-1, .  
32a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a60 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
32a70 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20  _INT_TO_PTR(n), 
32a80 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
32a90 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54     assert( n<=pT
32aa0 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
32ab0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
32ac0 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
32ad0 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
32ae0 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
32af0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
32b00 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
32b10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
32b20 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66  TIC_INDEX.    if
32b30 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
32b40 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
32b50 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
32b60 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d    constructAutom
32b70 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65  aticIndex(pParse
32b80 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  , &pWInfo->sWC, 
32b90 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61  pTabItem, notRea
32ba0 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  dy, pLevel);.   
32bb0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
32bc0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
32bd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
32be0 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e  EXED ){.      In
32bf0 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70  dex *pIx = pLoop
32c00 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
32c10 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
32c20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49  *pKey = sqlite3I
32c30 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
32c40 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
32c50 2f 2a 20 46 49 58 4d 45 3a 20 20 41 73 20 61 6e  /* FIXME:  As an
32c60 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73   optimization us
32c70 65 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  e pTabItem->iCur
32c80 73 6f 72 20 69 66 20 57 48 45 52 45 5f 49 44 58  sor if WHERE_IDX
32c90 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69  _ONLY */.      i
32ca0 6e 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70  nt iIndexCur = p
32cb0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
32cc0 20 69 49 64 78 43 75 72 20 3f 20 69 49 64 78 43   iIdxCur ? iIdxC
32cd0 75 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur : pParse->nTa
32ce0 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b++;.      asser
32cf0 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
32d00 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
32d10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32d20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a  iIndexCur>=0 );.
32d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32d40 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
32d50 65 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75  enRead, iIndexCu
32d60 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
32d70 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
32d80 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
32d90 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
32da0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
32db0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
32dc0 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
32dd0 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
32de0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
32df0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
32e00 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65   iDb);.    notRe
32e10 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
32e20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
32e30 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t, pTabItem->iCu
32e40 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49  rsor);.  }.  pWI
32e50 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69  nfo->iTop = sqli
32e60 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
32e70 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d  dr(v);.  if( db-
32e80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
32e90 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
32ea0 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  rror;..  /* Gene
32eb0 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
32ec0 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20   do the search. 
32ed0 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   Each iteration 
32ee0 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20  of the for.  ** 
32ef0 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72  loop below gener
32f00 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20  ates code for a 
32f10 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f  single nested lo
32f20 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a  op of the VM.  *
32f30 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a  * program..  */.
32f40 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
32f50 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
32f60 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73  ii=0; ii<nTabLis
32f70 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  t; ii++){.    pL
32f80 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
32f90 61 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61  a[ii];.    expla
32fa0 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65  inOneScan(pParse
32fb0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
32fc0 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e  el, ii, pLevel->
32fd0 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67  iFrom, wctrlFlag
32fe0 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  s);.    notReady
32ff0 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74   = codeOneLoopSt
33000 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20  art(pWInfo, ii, 
33010 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
33020 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
33030 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
33040 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ont;.  }..  /* D
33050 6f 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  one. */.  return
33060 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a   pWInfo;..  /* J
33070 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c  ump here if mall
33080 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72  oc fails */.wher
33090 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69  eBeginError:.  i
330a0 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20  f( pWInfo ){.   
330b0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
330c0 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
330d0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
330e0 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65     whereInfoFree
330f0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
33100 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
33110 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
33120 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
33130 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
33140 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
33150 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
33160 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
33170 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
33180 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
33190 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
331a0 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61  o *pWInfo){.  Pa
331b0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
331c0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
331d0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
331e0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
331f0 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
33200 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c  pLevel;.  WhereL
33210 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72  oop *pLoop;.  Sr
33220 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
33230 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
33240 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
33250 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
33260 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
33270 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
33280 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  code..  */.  sql
33290 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
332a0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
332b0 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  r(i=pWInfo->nLev
332c0 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  el-1; i>=0; i--)
332d0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
332e0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
332f0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
33300 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71  ->pWLoop;.    sq
33310 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
33320 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
33330 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
33340 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
33350 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
33360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33370 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p2(v, pLevel->op
33380 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
33390 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20  evel->p2);.     
333a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
333b0 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geP5(v, pLevel->
333c0 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  p5);.    }.    i
333d0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
333e0 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
333f0 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  E && pLevel->u.i
33400 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  n.nIn>0 ){.     
33410 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
33420 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  pIn;.      int j
33430 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
33440 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
33450 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e  v, pLevel->addrN
33460 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  xt);.      for(j
33470 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  =pLevel->u.in.nI
33480 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e  n, pIn=&pLevel->
33490 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31  u.in.aInLoop[j-1
334a0 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e  ]; j>0; j--, pIn
334b0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  --){.        sql
334c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
334d0 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
334e0 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  op+1);.        s
334f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
33500 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
33510 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20  pOp, pIn->iCur, 
33520 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b  pIn->addrInTop);
33530 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33540 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
33550 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
33560 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33570 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
33580 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
33590 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a  aInLoop);.    }.
335a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
335b0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
335c0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
335d0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
335e0 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
335f0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
33600 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
33610 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
33620 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c  OP_IfPos, pLevel
33630 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
33640 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
33650 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
33660 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
33670 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
33680 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
33690 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
336a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
336b0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
336c0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
336d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
336e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
336f0 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
33700 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
33710 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
33720 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  }.      if( pLoo
33730 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
33740 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
33750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33760 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
33770 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69  llRow, pLevel->i
33780 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
33790 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
337a0 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e  l->op==OP_Return
337b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
337c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
337d0 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65   OP_Gosub, pLeve
337e0 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61  l->p1, pLevel->a
337f0 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
33800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33810 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33820 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
33830 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
33840 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
33850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
33860 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
33870 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
33880 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
33890 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
338a0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
338b0 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
338c0 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
338d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
338e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
338f0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
33900 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
33910 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
33920 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64  that were opened
33930 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
33940 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  Begin..  */.  as
33950 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
33960 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66  evel==1 || pWInf
33970 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c  o->nLevel==pTabL
33980 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66  ist->nSrc );.  f
33990 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
339a0 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e  WInfo->a; i<pWIn
339b0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c  fo->nLevel; i++,
339c0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
339d0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b  Index *pIdx = 0;
339e0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
339f0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
33a00 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
33a10 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
33a20 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
33a30 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
33a40 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
33a50 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70  pTab!=0 );.    p
33a60 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
33a70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28  WLoop;.    if( (
33a80 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
33a90 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
33aa0 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e  0.     && pTab->
33ab0 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20  pSelect==0.     
33ac0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
33ad0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
33ae0 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
33af0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
33b00 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e  int ws = pLoop->
33b10 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69  wsFlags;.      i
33b20 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
33b30 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57  ePass && (ws & W
33b40 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
33b50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
33b60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
33b70 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
33b80 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
33b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33ba0 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e  ( (ws & WHERE_IN
33bb0 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77 73  DEXED)!=0 && (ws
33bc0 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
33bd0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 29  ERE_TEMP_INDEX))
33be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
33bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
33c00 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c  (v, OP_Close, pL
33c10 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
33c20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
33c30 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
33c40 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
33c50 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62 73  , make code subs
33c60 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
33c70 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
33c80 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  om the index in 
33c90 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68  preference to th
33ca0 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d  e table. Sometim
33cb0 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20  es, this means. 
33cc0 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
33cd0 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72 65  need never be re
33ce0 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69 73  ad from. This is
33cf0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62   a performance b
33d00 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20  oost,.    ** as 
33d10 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20 77  the vdbe level w
33d20 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20 74  aits until the t
33d30 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65 66  able is read bef
33d40 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  ore actually.   
33d50 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65 20   ** seeking the 
33d60 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20  table cursor to 
33d70 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72 65  the record corre
33d80 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
33d90 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70  current.    ** p
33da0 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 69  osition in the i
33db0 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  ndex..    ** .  
33dc0 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
33dd0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
33de0 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
33df0 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
33e00 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
33e10 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
33e20 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
33e30 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
33e40 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
33e50 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
33e60 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
33e70 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
33e80 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
33e90 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
33ea0 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
33eb0 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
33ec0 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
33ed0 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
33ee0 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
33ef0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f    */.    if( pLo
33f00 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
33f10 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45  HERE_INDEXED|WHE
33f20 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a  RE_IDX_ONLY) ){.
33f30 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f        pIdx = pLo
33f40 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
33f50 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ex;.    }else if
33f60 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
33f70 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
33f80 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  R ){.      pIdx 
33f90 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76  = pLevel->u.pCov
33fa0 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  idx;.    }.    i
33fb0 66 28 20 70 49 64 78 20 26 26 20 21 64 62 2d 3e  f( pIdx && !db->
33fc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
33fd0 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20        int k, j, 
33fe0 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65  last;.      Vdbe
33ff0 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20  Op *pOp;..      
34000 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
34010 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f  eGetOp(v, pWInfo
34020 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c  ->iTop);.      l
34030 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
34040 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
34050 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49  .      for(k=pWI
34060 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73  nfo->iTop; k<las
34070 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; k++, pOp++){.
34080 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
34090 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
340a0 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
340b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
340c0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
340d0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
340e0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
340f0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
34100 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
34110 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e   pOp->p2==pIdx->
34120 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20  aiColumn[j] ){. 
34130 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
34140 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20  ->p2 = j;.      
34150 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
34160 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
34170 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
34180 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
34190 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
341a0 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
341b0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
341c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
341d0 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 6a 3c 70 49  ONLY)==0 || j<pI
341e0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  dx->nColumn );. 
341f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
34200 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
34210 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
34220 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
34230 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
34240 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
34250 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
34260 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
34270 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
34280 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61  .  /* Final clea
34290 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73  nup.  */.  pPars
342a0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
342b0 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
342c0 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65  eryLoop;.  where
342d0 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
342e0 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  nfo);.  return;.
342f0 7d 0a                                            }.