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

Artifact 7d24dda2b2e8cf62c74e4f5f38bab160596ad658:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0570: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0580: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0590: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
05a0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
05b0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
05c0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
05d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05e0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05f0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0600: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0610: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0620: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
0630: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
0640: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
0650: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
0660: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
0670: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
0680: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0690: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06a0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06b0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06d0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06e0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06f0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0700: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0710: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0720: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0730: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0750: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0760: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0770: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0780: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0790: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07a0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07b0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07c0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
07d0: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
07e0: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
07f0: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0800: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0810: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0820: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0830: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0840: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0850: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0860: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0870: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0880: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0890: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08a0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08b0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
08c0: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
08d0: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08e0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0900: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0910: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0920: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0930: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0940: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0950: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
0960: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
0970: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
0980: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
0990: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09a0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09b0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
09c0: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
09d0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
09e0: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
09f0: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a10: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a20: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a30: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0a60: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0a80: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0a90: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0aa0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0ab0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0ac0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0ad0: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0ae0: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0af0: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b00: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b10: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b30: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b40: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b50: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0b60: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0b70: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0b80: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0ba0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bb0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0bc0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0bd0: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0be0: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c00: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c10: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c30: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c40: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c50: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0c60: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0c70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0c80: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0c90: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ca0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cb0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0cc0: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0cd0: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0ce0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0cf0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d00: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d10: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d20: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d30: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d50: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0d60: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0d70: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0d80: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0d90: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0da0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0db0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0dc0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0dd0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0de0: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0df0: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e00: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e10: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e20: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e40: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e50: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0e60: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0e70: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0e80: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0e90: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ea0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0eb0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0ec0: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0ed0: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0ee0: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0ef0: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f00: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f10: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f20: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f30: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f40: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f50: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0f80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0f90: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fa0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0fc0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
0fd0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
0fe0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
0ff0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1000: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1020: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1030: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1040: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1050: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
1060: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
1070: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1080: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
1090: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10a0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f  nformation if eO
10c0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a  perator==WO_OR *
10d0: 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e  /.    WhereAndIn
10e0: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a  fo *pAndInfo; /*
10f0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
1100: 6f 6e 20 69 66 20 65 4f 70 65 72 61 74 6f 72 3d  on if eOperator=
1110: 3d 57 4f 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75  =WO_AND */.  } u
1120: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
1130: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
1140: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
1150: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
1160: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
1170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
1180: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
1190: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
11a0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
11b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11c0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
11d0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
11e0: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
11f0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
1200: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
1210: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
1220: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
1230: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
1240: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
1250: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
1260: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
1270: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
1280: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
1290: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
12a0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
12b0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
12c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
12d0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
12e0: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
12f0: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
1300: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
1310: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
1320: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1330: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
1340: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
1350: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
1360: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
1370: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
1380: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
1390: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
13a0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
13b0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
13c0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
13d0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
13e0: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
13f0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
1400: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
1410: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
1420: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
1430: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
1440: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
1450: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
1460: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
1470: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
1480: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
1490: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
14a0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
14b0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
14c0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
14d0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
14e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14f0: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
1500: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
1510: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
1520: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
1530: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
1540: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
1550: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
1560: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
1570: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
1580: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1590: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
15a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
15b0: 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20  cture holds all 
15c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
15d0: 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  t a.** WHERE cla
15e0: 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69  use.  Mostly thi
15f0: 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72  s is a container
1600: 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   for one or more
1610: 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a   WhereTerms..**.
1620: 2a 2a 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ** Explanation o
1630: 66 20 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61  f pOuter:  For a
1640: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
1650: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
1660: 20 20 20 20 20 20 20 20 20 20 61 20 41 4e 44 20            a AND 
1670: 28 28 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64  ((b AND c) OR (d
1680: 20 41 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a   AND e)) AND f.*
1690: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73  *.** There are s
16a0: 65 70 61 72 61 74 65 20 57 68 65 72 65 43 6c 61  eparate WhereCla
16b0: 75 73 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  use objects for 
16c0: 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65  the whole clause
16d0: 20 61 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20   and for.** the 
16e0: 73 75 62 63 6c 61 75 73 65 73 20 22 28 62 20 41  subclauses "(b A
16f0: 4e 44 20 63 29 22 20 61 6e 64 20 22 28 64 20 41  ND c)" and "(d A
1700: 4e 44 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75  ND e)".  The pOu
1710: 74 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ter field of the
1720: 0a 2a 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70  .** subclauses p
1730: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65  oints to the Whe
1740: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
1750: 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c  for the whole cl
1760: 61 75 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ause..*/.struct 
1770: 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20  WhereClause {.  
1780: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1790: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
17b0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
17c0: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20   *pMaskSet;  /* 
17d0: 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c 65  Mapping of table
17e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
17f0: 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20  to bitmasks */. 
1800: 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b 20   Bitmask vmask; 
1810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
1820: 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67  mask identifying
1830: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1840: 75 72 73 6f 72 73 20 2a 2f 0a 20 20 57 68 65 72  ursors */.  Wher
1850: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1860: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1870: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1880: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1890: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
18a0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
18b0: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
18c0: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
18d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18e0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18f0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
1900: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1920: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1930: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1950: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1960: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1970: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1980: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1990: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
19a0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
19b0: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
19c0: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
19d0: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19e0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19f0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1a00: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1a10: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1a20: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1a30: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a40: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a50: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a70: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a80: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a90: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1aa0: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1ab0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1ac0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1ad0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ae0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1af0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1b00: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1b10: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1b20: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1b30: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b50: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b60: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b70: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b80: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1ba0: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1bb0: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1bc0: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1bd0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1be0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bf0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1c00: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1c10: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1c20: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1c30: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c40: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c50: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c60: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c70: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1ca0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1cb0: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1cc0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1cd0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ce0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cf0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1d00: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1d10: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1d20: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1d30: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d40: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d50: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d60: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d70: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d80: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d90: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1da0: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1db0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1dc0: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1dd0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1de0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1df0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1e00: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1e10: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1e20: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1e30: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e40: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e50: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e60: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e70: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e80: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e90: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1ea0: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1eb0: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1ec0: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1ed0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1ef0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1f00: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1f10: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1f20: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1f30: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f40: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f50: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f60: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f70: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f80: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f90: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1fa0: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1fb0: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1fc0: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1fd0: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fe0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1ff0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
2000: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2010: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
2020: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
2030: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2040: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2050: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2060: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2070: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2080: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2090: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
20a0: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
20b0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
20c0: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
20d0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20e0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20f0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
2100: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
2110: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
2120: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
2130: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2140: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2150: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2160: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2170: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2180: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21b0: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
21c0: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
21d0: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21f0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
2200: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
2210: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
2220: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
2230: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2240: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2250: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2260: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2270: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2280: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2290: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
22a0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
22b0: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
22c0: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
22d0: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22e0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22f0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2300: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
2310: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
2320: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
2330: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2340: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2350: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2360: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2370: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2380: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2390: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
23a0: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
23b0: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
23c0: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
23d0: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23e0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
2400: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
2410: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
2420: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
2430: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2440: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2450: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2460: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2470: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2480: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2490: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
24a0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
24b0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
24c0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
24d0: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24f0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
2500: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
2510: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2520: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
2530: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2540: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2550: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2560: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2570: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2580: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
2590: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
25a0: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
25b0: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
25c0: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
25d0: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
25e0: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
25f0: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
2600: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
2610: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
2620: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
2630: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2640: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
2650: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
2660: 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46  ** Value for wsF
2670: 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2680: 20 62 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64   bestIndex() and
2690: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68   stored in.** Wh
26a0: 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73  ereLevel.wsFlags
26b0: 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 64  .  These flags d
26c0: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73  etermine which s
26d0: 65 61 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67  earch.** strateg
26e0: 69 65 73 20 61 72 65 20 61 70 70 72 6f 70 72 69  ies are appropri
26f0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ate..**.** The l
2700: 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  east significant
2710: 20 31 32 20 62 69 74 73 20 69 73 20 72 65 73 65   12 bits is rese
2720: 72 76 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66  rved as a mask f
2730: 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62  or WO_ values ab
2740: 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72  ove..** The Wher
2750: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66  eLevel.wsFlags f
2760: 69 65 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20  ield is usually 
2770: 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f  set to WO_IN|WO_
2780: 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a  EQ|WO_ISNULL..**
2790: 20 42 75 74 20 69 66 20 74 68 65 20 74 61 62 6c   But if the tabl
27a0: 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
27b0: 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a  able of a left j
27c0: 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e  oin, WhereLevel.
27d0: 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65  wsFlags.** is se
27e0: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
27f0: 2e 20 20 54 68 65 20 57 68 65 72 65 4c 65 76 65  .  The WhereLeve
2800: 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20  l.wsFlags field 
2810: 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64  can then be used
2820: 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20   as.** the "op" 
2830: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e  parameter to fin
2840: 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72  dTerm when we ar
2850: 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61  e resolving equa
2860: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
2870: 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73  ..** ISNULL cons
2880: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65  traints will the
2890: 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e  n not be used on
28a0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
28b0: 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f   of a left.** jo
28c0: 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31  in.  Tickets #21
28d0: 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f  77 and #2189..*/
28e0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
28f0: 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78 30 30  OWID_EQ     0x00
2900: 30 30 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64  001000  /* rowid
2910: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
2920: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
2930: 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  ne WHERE_ROWID_R
2940: 41 4e 47 45 20 20 30 78 30 30 30 30 32 30 30 30  ANGE  0x00002000
2950: 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20    /* rowid<EXPR 
2960: 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50  and/or rowid>EXP
2970: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
2980: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20  RE_COLUMN_EQ    
2990: 30 78 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78  0x00010000  /* x
29a0: 3d 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e  =EXPR or x IN (.
29b0: 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c  ..) or x IS NULL
29c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
29d0: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30  E_COLUMN_RANGE 0
29e0: 78 30 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c  x00020000  /* x<
29f0: 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58  EXPR and/or x>EX
2a00: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
2a10: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20  ERE_COLUMN_IN   
2a20: 20 30 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20   0x00040000  /* 
2a30: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
2a40: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
2a50: 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30  MN_NULL  0x00080
2a60: 30 30 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c  000  /* x IS NUL
2a70: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  L */.#define WHE
2a80: 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20  RE_INDEXED      
2a90: 30 78 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41  0x000f0000  /* A
2aa0: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 75 73 65  nything that use
2ab0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64  s an index */.#d
2ac0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f  efine WHERE_NOT_
2ad0: 46 55 4c 4c 53 43 41 4e 20 30 78 31 30 30 66 33  FULLSCAN 0x100f3
2ae0: 30 30 30 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74  000  /* Does not
2af0: 20 64 6f 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   do a full table
2b00: 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65   scan */.#define
2b10: 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20   WHERE_IN_ABLE  
2b20: 20 20 20 20 30 78 30 30 30 66 31 30 30 30 20 20      0x000f1000  
2b30: 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75 70 70 6f  /* Able to suppo
2b40: 72 74 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  rt an IN operato
2b50: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  r */.#define WHE
2b60: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20  RE_TOP_LIMIT    
2b70: 30 78 30 30 31 30 30 30 30 30 20 20 2f 2a 20 78  0x00100000  /* x
2b80: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
2b90: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
2ba0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
2bb0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 32 30  _LIMIT    0x0020
2bc0: 30 30 30 30 20 20 2f 2a 20 78 3e 45 58 50 52 20  0000  /* x>EXPR 
2bd0: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
2be0: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
2bf0: 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49   WHERE_BOTH_LIMI
2c00: 54 20 20 20 30 78 30 30 33 30 30 30 30 30 20 20  T   0x00300000  
2c10: 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61  /* Both x>EXPR a
2c20: 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65  nd x<EXPR */.#de
2c30: 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f  fine WHERE_IDX_O
2c40: 4e 4c 59 20 20 20 20 20 30 78 30 30 34 30 30 30  NLY     0x004000
2c50: 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  00  /* Use index
2c60: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
2c70: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
2c80: 45 52 45 5f 4f 52 44 45 52 45 44 20 20 20 20 20  ERE_ORDERED     
2c90: 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a 20   0x00800000  /* 
2ca0: 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65  Output will appe
2cb0: 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72  ar in correct or
2cc0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
2cd0: 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20  HERE_REVERSE    
2ce0: 20 20 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a    0x01000000  /*
2cf0: 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   Scan in reverse
2d00: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2d10: 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20  e WHERE_UNIQUE  
2d20: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2d30: 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d   /* Selects no m
2d40: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
2d50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2d60: 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20 20 20 30  E_ALL_UNIQUE   0
2d70: 78 30 34 30 30 30 30 30 30 20 20 2f 2a 20 54 68  x04000000  /* Th
2d80: 69 73 20 61 6e 64 20 61 6c 6c 20 70 72 69 6f 72  is and all prior
2d90: 20 68 61 76 65 20 6f 6e 65 20 72 6f 77 20 2a 2f   have one row */
2da0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
2db0: 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 30 38  IRTUALTABLE 0x08
2dc0: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76  000000  /* Use v
2dd0: 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f  irtual-table pro
2de0: 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69  cessing */.#defi
2df0: 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  ne WHERE_MULTI_O
2e00: 52 20 20 20 20 20 30 78 31 30 30 30 30 30 30 30  R     0x10000000
2e10: 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75    /* OR using mu
2e20: 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a  ltiple indices *
2e30: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2e40: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78 32  TEMP_INDEX   0x2
2e50: 30 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 73  0000000  /* Uses
2e60: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2e70: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  dex */.#define W
2e80: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 20 20 20  HERE_DISTINCT   
2e90: 20 20 30 78 34 30 30 30 30 30 30 30 20 20 2f 2a    0x40000000  /*
2ea0: 20 43 6f 72 72 65 63 74 20 6f 72 64 65 72 20 66   Correct order f
2eb0: 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 23  or DISTINCT */.#
2ec0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 56  define WHERE_COV
2ed0: 45 52 5f 53 43 41 4e 20 20 20 30 78 38 30 30 30  ER_SCAN   0x8000
2ee0: 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c 20 73 63  0000  /* Full sc
2ef0: 61 6e 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67  an of a covering
2f00: 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   index */../*.**
2f10: 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63 6f 6e   This module con
2f20: 74 61 69 6e 73 20 6d 61 6e 79 20 73 65 70 61 72  tains many separ
2f30: 61 74 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ate subroutines 
2f40: 74 68 61 74 20 77 6f 72 6b 20 74 6f 67 65 74 68  that work togeth
2f50: 65 72 20 74 6f 0a 2a 2a 20 66 69 6e 64 20 74 68  er to.** find th
2f60: 65 20 62 65 73 74 20 69 6e 64 69 63 65 73 20 74  e best indices t
2f70: 6f 20 75 73 65 20 66 6f 72 20 61 63 63 65 73 73  o use for access
2f80: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
2f90: 20 74 61 62 6c 65 20 69 6e 20 61 20 71 75 65 72   table in a quer
2fa0: 79 2e 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  y..** An instanc
2fb0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2fc0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c  ng structure hol
2fd0: 64 73 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ds context infor
2fe0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
2ff0: 0a 2a 2a 20 69 6e 64 65 78 20 73 65 61 72 63 68  .** index search
3000: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
3010: 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 70  be more easily p
3020: 61 73 73 65 64 20 62 65 74 77 65 65 6e 20 74 68  assed between th
3030: 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 72 6f 75  e various.** rou
3040: 74 69 6e 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  tines..*/.typede
3050: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 42 65  f struct WhereBe
3060: 73 74 49 64 78 20 57 68 65 72 65 42 65 73 74 49  stIdx WhereBestI
3070: 64 78 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65  dx;.struct Where
3080: 42 65 73 74 49 64 78 20 7b 0a 20 20 50 61 72 73  BestIdx {.  Pars
3090: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30b0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
30c0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
30d0: 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
30e0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
30f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
3100: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3110: 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
3120: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
3130: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
3140: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
3150: 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
3160: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
3170: 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
3180: 62 6c 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ble */.  Bitmask
3190: 20 6e 6f 74 56 61 6c 69 64 3b 20 20 20 20 20 20   notValid;      
31a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
31b0: 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
31c0: 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  e for any purpos
31d0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
31e0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
31f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
3200: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3210: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
3220: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
3230: 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74     /* The select
3240: 2d 6c 69 73 74 20 69 66 20 71 75 65 72 79 20 69  -list if query i
3250: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
3260: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
3270: 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 3b 20  fo **ppIdxInfo; 
3280: 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61  /* Index informa
3290: 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78  tion passed to x
32a0: 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 69  BestIndex */.  i
32b0: 6e 74 20 69 2c 20 6e 3b 20 20 20 20 20 20 20 20  nt i, n;        
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32d0: 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20 69 73 20  * Which loop is 
32e0: 62 65 69 6e 67 20 63 6f 64 65 64 3b 20 23 20 6f  being coded; # o
32f0: 66 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65  f loops */.  Whe
3300: 72 65 4c 65 76 65 6c 20 2a 61 4c 65 76 65 6c 3b  reLevel *aLevel;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3320: 49 6e 66 6f 20 61 62 6f 75 74 20 6f 75 74 65 72  Info about outer
3330: 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65 72   loops */.  Wher
3340: 65 43 6f 73 74 20 63 6f 73 74 3b 20 20 20 20 20  eCost cost;     
3350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3360: 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
3370: 20 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   plan */.};../*.
3380: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
3390: 66 20 74 68 65 20 70 72 6f 62 65 20 63 6f 73 74  f the probe cost
33a0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
33b0: 65 20 62 61 73 65 6c 69 6e 65 20 63 6f 73 74 0a  e baseline cost.
33c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
33d0: 6d 70 61 72 65 43 6f 73 74 28 63 6f 6e 73 74 20  mpareCost(const 
33e0: 57 68 65 72 65 43 6f 73 74 20 2a 70 50 72 6f 62  WhereCost *pProb
33f0: 65 2c 20 63 6f 6e 73 74 20 57 68 65 72 65 43 6f  e, const WhereCo
3400: 73 74 20 2a 70 42 61 73 65 6c 69 6e 65 29 7b 0a  st *pBaseline){.
3410: 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 72 43    if( pProbe->rC
3420: 6f 73 74 3c 70 42 61 73 65 6c 69 6e 65 2d 3e 72  ost<pBaseline->r
3430: 43 6f 73 74 20 29 20 72 65 74 75 72 6e 20 31 3b  Cost ) return 1;
3440: 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 72  .  if( pProbe->r
3450: 43 6f 73 74 3e 70 42 61 73 65 6c 69 6e 65 2d 3e  Cost>pBaseline->
3460: 72 43 6f 73 74 20 29 20 72 65 74 75 72 6e 20 30  rCost ) return 0
3470: 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  ;.  if( pProbe->
3480: 70 6c 61 6e 2e 6e 4f 42 53 61 74 3e 70 42 61 73  plan.nOBSat>pBas
3490: 65 6c 69 6e 65 2d 3e 70 6c 61 6e 2e 6e 4f 42 53  eline->plan.nOBS
34a0: 61 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  at ) return 1;. 
34b0: 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 6c 61   if( pProbe->pla
34c0: 6e 2e 6e 52 6f 77 3c 70 42 61 73 65 6c 69 6e 65  n.nRow<pBaseline
34d0: 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 29 20 72 65  ->plan.nRow ) re
34e0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
34f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
3500: 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c  tialize a preall
3510: 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75  ocated WhereClau
3520: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
3530: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
3540: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20  reClauseInit(.  
3550: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3570: 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62  WhereClause to b
3580: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e initialized */
3590: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
35a0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
35b0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
35c0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
35d0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
35e0: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
35f0: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75   table cursor nu
3600: 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b  mbers to bitmask
3610: 73 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  s */.  u16 wctrl
3620: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
3630: 2f 2a 20 4d 69 67 68 74 20 69 6e 63 6c 75 64 65  /* Might include
3640: 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
3650: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61  */.){.  pWC->pPa
3660: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
3670: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20  pWC->pMaskSet = 
3680: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d  pMaskSet;.  pWC-
3690: 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20 70  >pOuter = 0;.  p
36a0: 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20  WC->nTerm = 0;. 
36b0: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72   pWC->nSlot = Ar
36c0: 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74  raySize(pWC->aSt
36d0: 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20  atic);.  pWC->a 
36e0: 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a  = pWC->aStatic;.
36f0: 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30    pWC->vmask = 0
3700: 3b 0a 20 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c  ;.  pWC->wctrlFl
3710: 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
3720: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
3730: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
3740: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
3750: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
3760: 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  lause*);../*.** 
3770: 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d  Deallocate all m
3780: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
3790: 20 77 69 74 68 20 61 20 57 68 65 72 65 4f 72 49   with a WhereOrI
37a0: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
37b0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
37c0: 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  OrInfoDelete(sql
37d0: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f  ite3 *db, WhereO
37e0: 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65  rInfo *p){.  whe
37f0: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
3800: 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->wc);.  sqlite3
3810: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
3820: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
3830: 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  te all memory as
3840: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
3850: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a  WhereAndInfo obj
3860: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
3870: 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f  oid whereAndInfo
3880: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
3890: 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f  db, WhereAndInfo
38a0: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
38b0: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
38c0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
38d0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
38e0: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
38f0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
3900: 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65 72  cture.  The Wher
3910: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
3920: 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e  e.** itself is n
3930: 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73 20  ot freed.  This 
3940: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 69  routine is the i
3950: 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65 43  nverse of whereC
3960: 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a  lauseInit()..*/.
3970: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
3980: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65  eClauseClear(Whe
3990: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a  reClause *pWC){.
39a0: 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
39b0: 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74  Term *a;.  sqlit
39c0: 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50  e3 *db = pWC->pP
39d0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28  arse->db;.  for(
39e0: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20  i=pWC->nTerm-1, 
39f0: 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20  a=pWC->a; i>=0; 
3a00: 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69  i--, a++){.    i
3a10: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
3a20: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
3a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
3a40: 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70  rDelete(db, a->p
3a50: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
3a60: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
3a70: 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b  & TERM_ORINFO ){
3a80: 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e  .      whereOrIn
3a90: 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  foDelete(db, a->
3aa0: 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20  u.pOrInfo);.    
3ab0: 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46  }else if( a->wtF
3ac0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49  lags & TERM_ANDI
3ad0: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
3ae0: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
3af0: 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66  db, a->u.pAndInf
3b00: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
3b10: 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d  if( pWC->a!=pWC-
3b20: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
3b30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3b40: 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d  , pWC->a);.  }.}
3b50: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69  ../*.** Add a si
3b60: 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65  ngle new WhereTe
3b70: 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  rm entry to the 
3b80: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
3b90: 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e  ct pWC..** The n
3ba0: 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a  ew WhereTerm obj
3bb0: 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74  ect is construct
3bc0: 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61  ed from Expr p a
3bd0: 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e  nd with wtFlags.
3be0: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e  .** The index in
3bf0: 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65   pWC->a[] of the
3c00: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 69   new WhereTerm i
3c10: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
3c20: 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72  ccess..** 0 is r
3c30: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e  eturned if the n
3c40: 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75  ew WhereTerm cou
3c50: 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20  ld not be added 
3c60: 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a  due to a memory.
3c70: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ** allocation er
3c80: 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ror.  The memory
3c90: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
3ca0: 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f  ure will be reco
3cb0: 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  rded in.** the d
3cc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3cd0: 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69 67  flag so that hig
3ce0: 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69  her-level functi
3cf0: 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20 69  ons can detect i
3d00: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
3d10: 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65  utine will incre
3d20: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
3d30: 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72  the pWC->a[] arr
3d40: 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
3d50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74  .**.** If the wt
3d60: 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  Flags argument i
3d70: 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e  ncludes TERM_DYN
3d80: 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f  AMIC, then respo
3d90: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72  nsibility.** for
3da0: 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70   freeing the exp
3db0: 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73  ression p is ass
3dc0: 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72  umed by the Wher
3dd0: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70  eClause object p
3de0: 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  WC..** This is t
3df0: 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69 73  rue even if this
3e00: 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74   routine fails t
3e10: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
3e20: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
3e30: 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73  * WARNING:  This
3e40: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
3e50: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70  eallocate the sp
3e60: 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ace used to stor
3e70: 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e  e.** WhereTerms.
3e80: 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74    All pointers t
3e90: 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f  o WhereTerms sho
3ea0: 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74  uld be invalidat
3eb0: 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c  ed after.** call
3ec0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
3ed0: 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73  .  Such pointers
3ee0: 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61   may be reinitia
3ef0: 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e  lized by referen
3f00: 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d  cing.** the pWC-
3f10: 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  >a[] array..*/.s
3f20: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43  tatic int whereC
3f30: 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72  lauseInsert(Wher
3f40: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
3f50: 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67  pr *p, u8 wtFlag
3f60: 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  s){.  WhereTerm 
3f70: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64  *pTerm;.  int id
3f80: 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77  x;.  testcase( w
3f90: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
3fa0: 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a  RTUAL );  /* EV:
3fb0: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 20 2a   R-00211-15100 *
3fc0: 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65  /.  if( pWC->nTe
3fd0: 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29  rm>=pWC->nSlot )
3fe0: 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
3ff0: 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a  *pOld = pWC->a;.
4000: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4010: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pWC->pParse->d
4020: 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  b;.    pWC->a = 
4030: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4040: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57  aw(db, sizeof(pW
4050: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53  C->a[0])*pWC->nS
4060: 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  lot*2 );.    if(
4070: 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20   pWC->a==0 ){.  
4080: 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20      if( wtFlags 
4090: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
40a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
40b0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
40c0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
40d0: 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b    pWC->a = pOld;
40e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
40f0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
4100: 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20  y(pWC->a, pOld, 
4110: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
4120: 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20  )*pWC->nTerm);. 
4130: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43     if( pOld!=pWC
4140: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
4150: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4160: 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20  (db, pOld);.    
4170: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
4180: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
4190: 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e  ocSize(db, pWC->
41a0: 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  a)/sizeof(pWC->a
41b0: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72  [0]);.  }.  pTer
41c0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20  m = &pWC->a[idx 
41d0: 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b  = pWC->nTerm++];
41e0: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
41f0: 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  = p;.  pTerm->wt
4200: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
4210: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
4220: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
4230: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
4240: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
4250: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4260: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
4270: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
4280: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
4290: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
42a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
42b0: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
42c0: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
42d0: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
42e0: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
42f0: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
4300: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
4310: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
4320: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
4330: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
4340: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
4350: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
4360: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
4370: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
4380: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
4390: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
43a0: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
43b0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
43c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
43d0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
43e0: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
43f0: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
4400: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4420: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
4430: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
4440: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
4450: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
4460: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
4470: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
4480: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
4490: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
44a0: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
44b0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
44c0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
44d0: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
44e0: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
44f0: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
4500: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
4510: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
4520: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
4530: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
4540: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
4550: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
4560: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
4570: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
4580: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4590: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
45a0: 6e 74 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  nt op){.  pWC->o
45b0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66  p = (u8)op;.  if
45c0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
45d0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
45e0: 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20  ->op!=op ){.    
45f0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
4600: 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29  t(pWC, pExpr, 0)
4610: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
4620: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
4630: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29  Expr->pLeft, op)
4640: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
4650: 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69  (pWC, pExpr->pRi
4660: 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a  ght, op);.  }.}.
4670: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
4680: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
4690: 6d 61 73 6b 20 73 65 74 20 28 61 20 57 68 65 72  mask set (a Wher
46a0: 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29  eMaskSet object)
46b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74  .*/.#define init
46c0: 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73  MaskSet(P)  mems
46d0: 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(P, 0, sizeof(
46e0: 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  *P))../*.** Retu
46f0: 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  rn the bitmask f
4700: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
4710: 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  sor number.  Ret
4720: 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72  urn 0 if.** iCur
4730: 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  sor is not in th
4740: 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e set..*/.static
4750: 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b   Bitmask getMask
4760: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
4770: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
4780: 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rsor){.  int i;.
4790: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
47a0: 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65  et->n<=(int)size
47b0: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b  of(Bitmask)*8 );
47c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d  .  for(i=0; i<pM
47d0: 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  askSet->n; i++){
47e0: 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65  .    if( pMaskSe
47f0: 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f  t->ix[i]==iCurso
4800: 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  r ){.      retur
4810: 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  n ((Bitmask)1)<<
4820: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
4830: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4840: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d  * Create a new m
4850: 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69  ask for cursor i
4860: 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cursor..**.** Th
4870: 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f  ere is one curso
4880: 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74  r per table in t
4890: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
48a0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   The number of.*
48b0: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
48c0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
48d0: 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74  imited by a test
48e0: 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a   early in the.**
48f0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
4900: 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  in() routine.  S
4910: 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
4920: 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  he pMaskSet->ix[
4930: 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20  ].** array will 
4940: 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a  never overflow..
4950: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
4960: 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d  reateMask(WhereM
4970: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4980: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
4990: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
49a0: 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a  et->n < ArraySiz
49b0: 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20  e(pMaskSet->ix) 
49c0: 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69  );.  pMaskSet->i
49d0: 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d  x[pMaskSet->n++]
49e0: 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f   = iCursor;.}../
49f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4a00: 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69  e walks (recursi
4a10: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
4a20: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
4a30: 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d  erates.** a bitm
4a40: 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77  ask indicating w
4a50: 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
4a60: 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70  used in that exp
4a70: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e  ression.** tree.
4a80: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
4a90: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
4aa0: 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61   to work, the ca
4ab0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d  lling function m
4ac0: 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76  ust have.** prev
4ad0: 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73  iously invoked s
4ae0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
4af0: 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20  rNames() on the 
4b00: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65  expression.  See
4b10: 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 63  .** the header c
4b20: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
4b30: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
4b40: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
4b50: 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  n..** The sqlite
4b60: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
4b70: 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f  s() routines loo
4b80: 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61  ks for column na
4b90: 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20  mes and.** sets 
4ba0: 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f  their opcodes to
4bb0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
4bc0: 68 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65  heir Expr.iTable
4bd0: 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68   fields to.** th
4be0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
4bf0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
4c00: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
4c10: 20 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20   just has to.** 
4c20: 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75  translate the cu
4c30: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
4c40: 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  o bitmask values
4c50: 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74   and OR all.** t
4c60: 68 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65  he bitmasks toge
4c70: 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
4c80: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
4c90: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
4ca0: 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69  MaskSet*, ExprLi
4cb0: 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  st*);.static Bit
4cc0: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
4cd0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4ce0: 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a  askSet*, Select*
4cf0: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
4d00: 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  k exprTableUsage
4d10: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
4d20: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70  MaskSet, Expr *p
4d30: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
4d40: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  k = 0;.  if( p==
4d50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4d60: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
4d70: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b  LUMN ){.    mask
4d80: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
4d90: 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b  Set, p->iTable);
4da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b  .    return mask
4db0: 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65  ;.  }.  mask = e
4dc0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4dd0: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68  askSet, p->pRigh
4de0: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
4df0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
4e00: 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29  skSet, p->pLeft)
4e10: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
4e20: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
4e30: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
4e40: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
4e50: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
4e60: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c  skSet, p->x.pSel
4e70: 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ect);.  }else{. 
4e80: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
4e90: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
4ea0: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69  askSet, p->x.pLi
4eb0: 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
4ec0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
4ed0: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
4ee0: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
4ef0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
4f00: 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  et, ExprList *pL
4f10: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
4f20: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
4f30: 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
4f40: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4f50: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
4f60: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++){.      mask 
4f70: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
4f80: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
4f90: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
4fa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4fb0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
4fc0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
4fd0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57  lectTableUsage(W
4fe0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
4ff0: 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70  skSet, Select *p
5000: 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  S){.  Bitmask ma
5010: 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  sk = 0;.  while(
5020: 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69   pS ){.    SrcLi
5030: 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70  st *pSrc = pS->p
5040: 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  Src;.    mask |=
5050: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
5060: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
5070: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
5080: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
5090: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
50a0: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
50b0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
50c0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
50d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
50e0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
50f0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
5100: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
5110: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
5120: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
5130: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
5140: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
5150: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
5160: 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Src!=0) ){.     
5170: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
5180: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
5190: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
51a0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
51b0: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
51c0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e  pMaskSet, pSrc->
51d0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
51e0: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
51f0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
5200: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
5210: 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d  i].pOn);.      }
5220: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20  .    }.    pS = 
5230: 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  pS->pPrior;.  }.
5240: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
5250: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
5260: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
5270: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
5280: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
5290: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
52a0: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
52b0: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
52c0: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
52d0: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
52e0: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
52f0: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
5300: 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a  , and "IN"..**.*
5310: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
5320: 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32 36 33  -OF: R-59926-263
5330: 39 33 20 54 6f 20 62 65 20 75 73 61 62 6c 65 20  93 To be usable 
5340: 62 79 20 61 6e 20 69 6e 64 65 78 20 61 20 74 65  by an index a te
5350: 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f 66  rm must be.** of
5360: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
5370: 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f 6c  owing forms: col
5380: 75 6d 6e 20 3d 20 65 78 70 72 65 73 73 69 6f 6e  umn = expression
5390: 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65 73   column > expres
53a0: 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e  sion.** column >
53b0: 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  = expression col
53c0: 75 6d 6e 20 3c 20 65 78 70 72 65 73 73 69 6f 6e  umn < expression
53d0: 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72 65   column <= expre
53e0: 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73 73  ssion.** express
53f0: 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78 70  ion = column exp
5400: 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e  ression > column
5410: 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20 63   expression >= c
5420: 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73 73  olumn.** express
5430: 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78 70  ion < column exp
5440: 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d  ression <= colum
5450: 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28  n column IN.** (
5460: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 29  expression-list)
5470: 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62 71   column IN (subq
5480: 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53 20  uery) column IS 
5490: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
54a0: 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74  nt allowedOp(int
54b0: 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   op){.  assert( 
54c0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_GT>TK_EQ && T
54d0: 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_GT<TK_GE );.  
54e0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b  assert( TK_LT>TK
54f0: 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f  _EQ && TK_LT<TK_
5500: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
5510: 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LE>TK_EQ && T
5520: 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LE<TK_GE );.  
5530: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
5540: 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75  K_EQ+4 );.  retu
5550: 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  rn op==TK_IN || 
5560: 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70  (op>=TK_EQ && op
5570: 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d  <=TK_GE) || op==
5580: 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a  TK_ISNULL;.}../*
5590: 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a  .** Swap two obj
55a0: 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50  ects of type TYP
55b0: 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  E..*/.#define SW
55c0: 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59  AP(TYPE,A,B) {TY
55d0: 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74  PE t=A; A=B; B=t
55e0: 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74  ;}../*.** Commut
55f0: 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  e a comparison o
5600: 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73  perator.  Expres
5610: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
5620: 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72  m "X op Y".** ar
5630: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
5640: 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a   "Y op X"..**.**
5650: 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20   If a collation 
5660: 73 65 71 75 65 6e 63 65 20 69 73 20 61 73 73 6f  sequence is asso
5670: 63 69 61 74 65 64 20 77 69 74 68 20 65 69 74 68  ciated with eith
5680: 65 72 20 74 68 65 20 6c 65 66 74 20 6f 72 20 72  er the left or r
5690: 69 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f 66 20  ight.** side of 
56a0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  the comparison, 
56b0: 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f 63  it remains assoc
56c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
56d0: 61 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a 2a  ame side after.*
56e0: 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69 6f  * the commutatio
56f0: 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74 65  n. So "Y collate
5700: 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65   NOCASE op X" be
5710: 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63 6f 6c  comes .** "X col
5720: 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 59  late NOCASE op Y
5730: 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ". This is becau
5740: 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  se any collation
5750: 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20   sequence on.** 
5760: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69  the left hand si
5770: 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  de of a comparis
5780: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
5790: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
57a0: 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  nce .** attached
57b0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46   to the right. F
57c0: 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61 73  or the same reas
57d0: 6f 6e 20 74 68 65 20 45 50 5f 45 78 70 43 6f 6c  on the EP_ExpCol
57e0: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
57f0: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
5800: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
5810: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
5820: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
5830: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
5840: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
5850: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
5860: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  P_ExpCollate);. 
5870: 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28   u16 expLeft = (
5880: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
5890: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
58a0: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ate);.  assert( 
58b0: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d  allowedOp(pExpr-
58c0: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f  >op) && pExpr->o
58d0: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 70 45  p!=TK_IN );.  pE
58e0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
58f0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5900: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5910: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
5920: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
5930: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
5940: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
5950: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
5960: 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53 65 71  ;.  SWAP(CollSeq
5970: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d  *,pExpr->pRight-
5980: 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c  >pColl,pExpr->pL
5990: 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70  eft->pColl);.  p
59a0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
59b0: 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 52  ags = (pExpr->pR
59c0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45  ight->flags & ~E
59d0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20  P_ExpCollate) | 
59e0: 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78 70 72  expLeft;.  pExpr
59f0: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 3d  ->pLeft->flags =
5a00: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
5a10: 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43  flags & ~EP_ExpC
5a20: 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52 69 67  ollate) | expRig
5a30: 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a  ht;.  SWAP(Expr*
5a40: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70  ,pExpr->pRight,p
5a50: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
5a60: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  if( pExpr->op>=T
5a70: 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65  K_GT ){.    asse
5a80: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
5a90: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
5aa0: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32  ( TK_GE==TK_LE+2
5ab0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
5ac0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20  TK_GT>TK_EQ );. 
5ad0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
5ae0: 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  <TK_LE );.    as
5af0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e  sert( pExpr->op>
5b00: 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d  =TK_GT && pExpr-
5b10: 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op<=TK_GE );.  
5b20: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28    pExpr->op = ((
5b30: 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29  pExpr->op-TK_GT)
5b40: 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d  ^2)+TK_GT;.  }.}
5b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  ../*.** Translat
5b60: 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65  e from TK_xx ope
5b70: 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62  rator to WO_xx b
5b80: 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  itmask..*/.stati
5b90: 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61  c u16 operatorMa
5ba0: 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31  sk(int op){.  u1
5bb0: 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61  6 c;.  assert( a
5bc0: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a  llowedOp(op) );.
5bd0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
5be0: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e  ){.    c = WO_IN
5bf0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
5c00: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
5c10: 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c     c = WO_ISNULL
5c20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
5c30: 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28  ssert( (WO_EQ<<(
5c40: 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37  op-TK_EQ)) < 0x7
5c50: 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28  fff );.    c = (
5c60: 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d  u16)(WO_EQ<<(op-
5c70: 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61  TK_EQ));.  }.  a
5c80: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53  ssert( op!=TK_IS
5c90: 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53  NULL || c==WO_IS
5ca0: 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  NULL );.  assert
5cb0: 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63  ( op!=TK_IN || c
5cc0: 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73  ==WO_IN );.  ass
5cd0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c  ert( op!=TK_EQ |
5ce0: 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  | c==WO_EQ );.  
5cf0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
5d00: 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b  T || c==WO_LT );
5d10: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
5d20: 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45  K_LE || c==WO_LE
5d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5d40: 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GT || c==WO
5d50: 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GT );.  assert(
5d60: 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d   op!=TK_GE || c=
5d70: 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75  =WO_GE );.  retu
5d80: 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn c;.}../*.** S
5d90: 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d  earch for a term
5da0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
5db0: 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20  ause that is of 
5dc0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
5dd0: 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72   <expr>".** wher
5de0: 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e  e X is a referen
5df0: 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d  ce to the iColum
5e00: 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20  n of table iCur 
5e10: 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  and <op> is one 
5e20: 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20  of.** the WO_xx 
5e30: 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73  operator codes s
5e40: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
5e50: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  op parameter..**
5e60: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
5e70: 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20  r to the term.  
5e80: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20  Return 0 if not 
5e90: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
5ea0: 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64   WhereTerm *find
5eb0: 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61  Term(.  WhereCla
5ec0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
5ed0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
5ee0: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
5ef0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5f10: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
5f20: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  LHS */.  int iCo
5f30: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  lumn,          /
5f40: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
5f50: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d  of LHS */.  Bitm
5f60: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
5f70: 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f    /* RHS must no
5f80: 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74  t overlap with t
5f90: 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33  his mask */.  u3
5fa0: 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  2 op,           
5fb0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57      /* Mask of W
5fc0: 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63  O_xx values desc
5fd0: 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20  ribing operator 
5fe0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
5ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
6000: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
6010: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
6020: 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
6030: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
6040: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b  *pTerm;.  int k;
6050: 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72 3e  .  assert( iCur>
6060: 3d 30 20 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f  =0 );.  op &= WO
6070: 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28 3b 20 70 57  _ALL;.  for(; pW
6080: 43 3b 20 70 57 43 3d 70 57 43 2d 3e 70 4f 75 74  C; pWC=pWC->pOut
6090: 65 72 29 7b 0a 20 20 20 20 66 6f 72 28 70 54 65  er){.    for(pTe
60a0: 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43  rm=pWC->a, k=pWC
60b0: 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c  ->nTerm; k; k--,
60c0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
60d0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
60e0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20  Cursor==iCur.   
60f0: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
6100: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
6110: 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20  otReady)==0.    
6120: 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75       && pTerm->u
6130: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
6140: 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26  lumn.         &&
6150: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
6160: 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20  or & op)!=0.    
6170: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28    ){.        if(
6180: 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70   iColumn>=0 && p
6190: 49 64 78 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f  Idx && pTerm->eO
61a0: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55  perator!=WO_ISNU
61b0: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
61c0: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
61d0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
61e0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
61f0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  l;.          cha
6200: 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20  r idxaff;.      
6210: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
6220: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
6230: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
6240: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 69  ;.  .          i
6250: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
6260: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
6270: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
6280: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
6290: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
62a0: 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20  yOk(pX, idxaff) 
62b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 0a 20  ) continue;.  . 
62c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67 75           /* Figu
62d0: 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61  re out the colla
62e0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65  tion sequence re
62f0: 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e 20 69  quired from an i
6300: 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20 20 20  ndex for.       
6310: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75     ** it to be u
6320: 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69  seful for optimi
6330: 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  sing expression 
6340: 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20  pX. Store this. 
6350: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
6360: 65 20 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43  e in variable pC
6370: 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  oll..          *
6380: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
6390: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
63a0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
63b0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
63c0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
63d0: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
63e0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
63f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 43         assert(pC
6400: 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  oll || pParse->n
6410: 45 72 72 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  Err);.  .       
6420: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78     for(j=0; pIdx
6430: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69  ->aiColumn[j]!=i
6440: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
6450: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
6460: 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f  VER(j>=pIdx->nCo
6470: 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30  lumn) ) return 0
6480: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6490: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
64a0: 6c 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  l && sqlite3StrI
64b0: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
64c0: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  , pIdx->azColl[j
64d0: 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ]) ) continue;. 
64e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
64f0: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
6500: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6510: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
6520: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
6530: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
6540: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
6550: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
6560: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
6570: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
6580: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
6590: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
65a0: 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f  ause.  .**.**.*/
65b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
65c0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53  rAnalyzeAll(.  S
65d0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
65e0: 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46  ,       /* the F
65f0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
6600: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
6610: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
6620: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
6630: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
6640: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
6650: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
6660: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
6670: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
6680: 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a  bList, pWC, i);.
6690: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
66a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
66b0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  OPTIMIZATION./*.
66c0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
66d0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
66e0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b  ression is a LIK
66f0: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
6700: 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  or that.** can b
6710: 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
6720: 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  g inequality con
6730: 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72  straints.  Retur
6740: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a  n TRUE if it is.
6750: 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20  ** so and false 
6760: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  if not..**.** In
6770: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f   order for the o
6780: 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70  perator to be op
6790: 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52  timizible, the R
67a0: 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72  HS must be a str
67b0: 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74  ing.** literal t
67c0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  hat does not beg
67d0: 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61  in with a wildca
67e0: 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  rd.  .*/.static 
67f0: 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62  int isLikeOrGlob
6800: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6810: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
6820: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
6830: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
6840: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
6850: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
6860: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
6870: 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78   Expr **ppPrefix
6880: 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ,  /* Pointer to
6890: 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65   TK_STRING expre
68a0: 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65  ssion with patte
68b0: 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69  rn prefix */.  i
68c0: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c  nt *pisComplete,
68d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
68e0: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
68f0: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
6900: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
6910: 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20  t *pnoCase      
6920: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
6930: 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65  case is equivale
6940: 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20  nt to lowercase 
6950: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
6960: 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20  ar *z = 0;      
6970: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20     /* String on 
6980: 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  RHS of LIKE oper
6990: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ator */.  Expr *
69a0: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20  pRight, *pLeft; 
69b0: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e       /* Right an
69c0: 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c  d left size of L
69d0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
69e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
69f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
6a00: 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73  List of operands
6a10: 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65   to the LIKE ope
6a20: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
6a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6a40: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61        /* One cha
6a50: 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f  racter in z[] */
6a60: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a80: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
6a90: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
6aa0: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63  haracters */.  c
6ab0: 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20  har wc[3];      
6ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c            /* Wil
6ad0: 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73  dcard characters
6ae0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6af0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
6b00: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
6b10: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  nection */.  sql
6b20: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
6b30: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20   = 0;.  int op; 
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20     /* Opcode of 
6b60: 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28  pRight */..  if(
6b70: 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46   !sqlite3IsLikeF
6b80: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70  unction(db, pExp
6b90: 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20  r, pnoCase, wc) 
6ba0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6bb0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
6bc0: 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20  TE_EBCDIC.  if( 
6bd0: 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72  *pnoCase ) retur
6be0: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c  n 0;.#endif.  pL
6bf0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
6c00: 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20  List;.  pLeft = 
6c10: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
6c20: 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  r;.  if( pLeft->
6c30: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20  op!=TK_COLUMN . 
6c40: 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
6c50: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21  Affinity(pLeft)!
6c60: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
6c70: 20 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61   .   || IsVirtua
6c80: 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20  l(pLeft->pTab). 
6c90: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20   ){.    /* IMP: 
6ca0: 52 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68  R-02065-49465 Th
6cb0: 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
6cc0: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20   of the LIKE or 
6cd0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75  GLOB operator mu
6ce0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
6cf0: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65   name of an inde
6d00: 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  xed column with 
6d10: 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a  TEXT affinity. *
6d20: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
6d30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
6d40: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d  eft->iColumn!=(-
6d50: 31 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  1) ); /* Because
6d60: 20 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41   IPK never has A
6d70: 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52  FF_TEXT */..  pR
6d80: 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  ight = pList->a[
6d90: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d  0].pExpr;.  op =
6da0: 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69   pRight->op;.  i
6db0: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
6dc0: 45 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70  ER ){.    op = p
6dd0: 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a  Right->op2;.  }.
6de0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52    if( op==TK_VAR
6df0: 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62  IABLE ){.    Vdb
6e00: 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20  e *pReprepare = 
6e10: 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
6e20: 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  re;.    int iCol
6e30: 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75   = pRight->iColu
6e40: 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  mn;.    pVal = s
6e50: 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c  qlite3VdbeGetVal
6e60: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
6e70: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
6e80: 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70  NONE);.    if( p
6e90: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
6ea0: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
6eb0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
6ec0: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20        z = (char 
6ed0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6ee0: 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  text(pVal);.    
6ef0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
6f00: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
6f10: 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29  se->pVdbe, iCol)
6f20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
6f30: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
6f40: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
6f50: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
6f60: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
6f70: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
6f80: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
6f90: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
6fa0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
6fb0: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
6fc0: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
6fd0: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
6fe0: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
6ff0: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
7000: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
7010: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
7020: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
7030: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
7040: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
7050: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
7060: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
7070: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
7080: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
7090: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
70a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
70b0: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
70c0: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
70d0: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
70e0: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
70f0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
7100: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
7110: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
7120: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
7130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7140: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
7150: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ght->iColumn);. 
7160: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
7170: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
7180: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
7190: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
71a0: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
71b0: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
71c0: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
71d0: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
71e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
71f0: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
7200: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
7210: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
7220: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
7230: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
7240: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
7250: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
7260: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
7270: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
7280: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
7290: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
72a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
72b0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
72c0: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
72d0: 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68  To workaround th
72e0: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
72f0: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
7300: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
7310: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
7320: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7330: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7350: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
7360: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
7370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
7380: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
7390: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
73a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
73b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
73c0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
73d0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
73e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
73f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
7400: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
7410: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
7420: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
7430: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
7440: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7450: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
7460: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
7470: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7480: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
7490: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
74a0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
74b0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
74c0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
74d0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
74e0: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
74f0: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
7500: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
7510: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
7520: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
7530: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
7540: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
7550: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
7560: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
7570: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
7580: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
7590: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
75a0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
75b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
75c0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
75d0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
75e0: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
75f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7600: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
7610: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
7620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
7630: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7640: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
7650: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
7660: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
7670: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7680: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
7690: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
76a0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
76b0: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
76c0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
76d0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
76e0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
76f0: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
7700: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
7710: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
7720: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
7730: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
7740: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7750: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
7760: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
7770: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
7780: 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66  ){.  pDerived->f
7790: 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66  lags |= pBase->f
77a0: 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f  lags & EP_FromJo
77b0: 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  in;.  pDerived->
77c0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
77d0: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
77e0: 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66  oinTable;.}..#if
77f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7800: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
7810: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
7820: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
7830: 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41  UBQUERY)./*.** A
7840: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
7850: 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  at consists of t
7860: 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f  wo or more OR-co
7870: 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65  nnected.** subte
7880: 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a  rms.  So in:.**.
7890: 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45  **     ... WHERE
78a0: 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37    (a=5) AND (b=7
78b0: 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29   OR c=9 OR d=13)
78c0: 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20   AND (d=13).**  
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e          ^^^^^^^^
78f0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a  ^^^^^^^^^^^^.**.
7900: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7910: 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73  analyzes terms s
7920: 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c  uch as the middl
7930: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62  e term in the ab
7940: 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20  ove example..** 
7950: 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  A WhereOrTerm ob
7960: 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64  ject is computed
7970: 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f   and attached to
7980: 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a   the term under.
7990: 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67  ** analysis, reg
79a0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
79b0: 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e  utcome of the an
79c0: 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a  alysis.  Hence:.
79d0: 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  **.**     WhereT
79e0: 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d  erm.wtFlags   |=
79f0: 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a    TERM_ORINFO.**
7a00: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75       WhereTerm.u
7a10: 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64  .pOrInfo  =  a d
7a20: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
7a30: 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d  ated WhereOrTerm
7a40: 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68   object.**.** Th
7a50: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61  e term being ana
7a60: 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20  lyzed must have 
7a70: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f  two or more of O
7a80: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74  R-connected subt
7a90: 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c  erms..** A singl
7aa0: 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20  e subterm might 
7ab0: 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d  be a set of AND-
7ac0: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75  connected sub-su
7ad0: 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70  bterms..** Examp
7ae0: 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64  les of terms und
7af0: 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a  er analysis:.**.
7b00: 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74  **     (A)     t
7b10: 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78  1.x=t2.y OR t1.x
7b20: 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35  =t2.z OR t1.y=15
7b30: 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a   OR t1.z=t3.a+5.
7b40: 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78  **     (B)     x
7b50: 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d  =expr1 OR expr2=
7b60: 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20  x OR x=expr3.** 
7b70: 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78      (C)     t1.x
7b80: 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74  =t2.y OR (t1.x=t
7b90: 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29  2.z AND t1.y=15)
7ba0: 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20  .**     (D)     
7bb0: 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31  x=expr1 OR (y>11
7bc0: 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20   AND y<22 AND z 
7bd0: 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a  LIKE '*hello*').
7be0: 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28  **     (E)     (
7bf0: 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20  p.a=1 AND q.b=2 
7c00: 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70  AND r.c=3) OR (p
7c10: 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41  .x=4 AND q.y=5 A
7c20: 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20  ND r.z=6).**.** 
7c30: 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66  CASE 1:.**.** If
7c40: 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72   all subterms ar
7c50: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e  e of the form T.
7c60: 43 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20  C=expr for some 
7c70: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
7c80: 20 43 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74   C.** a single t
7c90: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
7ca0: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
7cb0: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
7cc0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
7cd0: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
7ce0: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
7cf0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
7d00: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
7d10: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
7d20: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
7d30: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
7d40: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
7d50: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
7d60: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
7d70: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
7d80: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
7d90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
7da0: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
7db0: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
7dc0: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   2:.**.** If all
7dd0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
7de0: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
7df0: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
7e00: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
7e10: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
7e20: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
7e30: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
7e40: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
7e50: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
7e60: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
7e70: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
7e80: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
7e90: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
7ea0: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
7eb0: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
7ec0: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
7ed0: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
7ee0: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
7ef0: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
7f00: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
7f10: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
7f20: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
7f30: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
7f40: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
7f50: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
7f60: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
7f70: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
7f80: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
7f90: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
7fa0: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
7fb0: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
7fc0: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
7fd0: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
7fe0: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
7ff0: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
8000: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
8010: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
8020: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
8030: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
8040: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
8050: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
8060: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
8070: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
8080: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
8090: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
80a0: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
80b0: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
80c0: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
80d0: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
80e0: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
80f0: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
8100: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
8110: 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20  s something the 
8120: 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74  bestIndex() rout
8130: 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69  ine will determi
8140: 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73  ne.  This analys
8150: 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73  is.** only looks
8160: 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74   at whether subt
8170: 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65  erms appropriate
8180: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78   for indexing ex
8190: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65  ist..**.** All e
81a0: 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67  xamples A throug
81b0: 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61  h E above all sa
81c0: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42  tisfy case 2.  B
81d0: 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20  ut if a term.** 
81e0: 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20  also statisfies 
81f0: 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20  case 1 (such as 
8200: 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  B) we know that 
8210: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69  the optimizer wi
8220: 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65  ll.** always pre
8230: 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69  fer case 1, so i
8240: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70  n that case we p
8250: 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65  retend that case
8260: 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74   2 is not.** sat
8270: 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  isfied..**.** It
8280: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
8290: 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  se that multiple
82a0: 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65   tables are inde
82b0: 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d  xable.  For exam
82c0: 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76  ple,.** (E) abov
82d0: 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f  e is indexable o
82e0: 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61  n tables P, Q, a
82f0: 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  nd R..**.** Term
8300: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
8310: 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64  ase 2 are candid
8320: 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20  ates for lookup 
8330: 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61  by using.** sepa
8340: 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20  rate indices to 
8350: 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20  find rowids for 
8360: 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64  each subterm and
8370: 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68   composing.** th
8380: 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72  e union of all r
8390: 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f  owids using a Ro
83a0: 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  wSet object.  Th
83b0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  is is similar.**
83c0: 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69   to "bitmap indi
83d0: 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61  ces" in other da
83e0: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a  tabase engines..
83f0: 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a  **.** OTHERWISE:
8400: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
8410: 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73  r case 1 nor cas
8420: 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20  e 2 apply, then 
8430: 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61  leave the eOpera
8440: 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65  tor set to.** ze
8450: 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69  ro.  This term i
8460: 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72  s not useful for
8470: 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74   search..*/.stat
8480: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
8490: 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63  yzeOrTerm(.  Src
84a0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
84b0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
84c0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
84d0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
84e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
84f0: 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63  complete WHERE c
8500: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
8510: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
8520: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
8530: 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20   the OR-term to 
8540: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
8550: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
8560: 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b  e = pWC->pParse;
8570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8580: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
8590: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
85a0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
85c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
85d0: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
85e0: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
85f0: 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f  a[idxTerm];    /
8600: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
8610: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45   analyzed */.  E
8620: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
8630: 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20  rm->pExpr;      
8640: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
8650: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
8660: 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d  term */.  WhereM
8670: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
8680: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
8690: 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d  ; /* Table use m
86a0: 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  asks */.  int i;
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
86e0: 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  rs */.  WhereCla
86f0: 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20  use *pOrWc;     
8700: 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20    /* Breakup of 
8710: 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65  pTerm into subte
8720: 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  rms */.  WhereTe
8730: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20  rm *pOrTerm;    
8740: 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d     /* A Sub-term
8750: 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57   within the pOrW
8760: 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e  c */.  WhereOrIn
8770: 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20  fo *pOrInfo;    
8780: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69   /* Additional i
8790: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63  nformation assoc
87a0: 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d  iated with pTerm
87b0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68   */.  Bitmask ch
87c0: 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20  ngToIN;         
87d0: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
87e0: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
87f0: 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  e 1 */.  Bitmask
8800: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
8810: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
8820: 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c  t are indexable,
8830: 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65   satisfying case
8840: 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   2 */..  /*.  **
8850: 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c   Break the OR cl
8860: 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65  ause into its se
8870: 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e  parate subterms.
8880: 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61    The subterms a
8890: 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  re.  ** stored i
88a0: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  n a WhereClause 
88b0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
88c0: 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20  ning within the 
88d0: 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a  WhereOrInfo.  **
88e0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
88f0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
8900: 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75  original OR clau
8910: 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  se term..  */.  
8920: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
8930: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
8940: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49  DYNAMIC|TERM_ORI
8950: 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  NFO|TERM_ANDINFO
8960: 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
8970: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
8980: 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  _OR );.  pTerm->
8990: 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49  u.pOrInfo = pOrI
89a0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
89b0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
89c0: 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b  zeof(*pOrInfo));
89d0: 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d  .  if( pOrInfo==
89e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
89f0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
8a00: 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70  TERM_ORINFO;.  p
8a10: 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d  OrWc = &pOrInfo-
8a20: 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  >wc;.  whereClau
8a30: 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57  seInit(pOrWc, pW
8a40: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C->pParse, pMask
8a50: 53 65 74 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46  Set, pWC->wctrlF
8a60: 6c 61 67 73 29 3b 0a 20 20 77 68 65 72 65 53 70  lags);.  whereSp
8a70: 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72  lit(pOrWc, pExpr
8a80: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72  , TK_OR);.  expr
8a90: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
8aa0: 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64   pOrWc);.  if( d
8ab0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8ac0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8ad0: 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  rt( pOrWc->nTerm
8ae0: 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  >=2 );..  /*.  *
8af0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65  * Compute the se
8b00: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
8b10: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
8b20: 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a  ases 1 or 2..  *
8b30: 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20  /.  indexable = 
8b40: 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63  ~(Bitmask)0;.  c
8b50: 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 70 57 43 2d  hngToIN = ~(pWC-
8b60: 3e 76 6d 61 73 6b 29 3b 0a 20 20 66 6f 72 28 69  >vmask);.  for(i
8b70: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
8b80: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
8b90: 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78  a; i>=0 && index
8ba0: 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  able; i--, pOrTe
8bb0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
8bc0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8bd0: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d  or & WO_SINGLE)=
8be0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
8bf0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
8c00: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
8c10: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8c20: 61 74 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ator==0 );.     
8c30: 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72   assert( (pOrTer
8c40: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
8c50: 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f  RM_ANDINFO|TERM_
8c60: 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  ORINFO))==0 );. 
8c70: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
8c80: 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66  0;.      pAndInf
8c90: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
8ca0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
8cb0: 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20  f(*pAndInfo));. 
8cc0: 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66       if( pAndInf
8cd0: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  o ){.        Whe
8ce0: 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43  reClause *pAndWC
8cf0: 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  ;.        WhereT
8d00: 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20  erm *pAndTerm;. 
8d10: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
8d20: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
8d30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = 0;.        pOr
8d40: 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
8d50: 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20   = pAndInfo;.   
8d60: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8d70: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e  Flags |= TERM_AN
8d80: 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70  DINFO;.        p
8d90: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8da0: 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20  r = WO_AND;.    
8db0: 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41      pAndWC = &pA
8dc0: 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
8dd0: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49      whereClauseI
8de0: 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d  nit(pAndWC, pWC-
8df0: 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65  >pParse, pMaskSe
8e00: 74 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61  t, pWC->wctrlFla
8e10: 67 73 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  gs);.        whe
8e20: 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20  reSplit(pAndWC, 
8e30: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  pOrTerm->pExpr, 
8e40: 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20  TK_AND);.       
8e50: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
8e60: 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20  pSrc, pAndWC);. 
8e70: 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70         pAndWC->p
8e80: 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
8e90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
8ea0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8eb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
8ec0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
8ee0: 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d  r(j=0, pAndTerm=
8ef0: 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e  pAndWC->a; j<pAn
8f00: 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  dWC->nTerm; j++,
8f10: 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20   pAndTerm++){.  
8f20: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8f30: 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  ( pAndTerm->pExp
8f40: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
8f50: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
8f60: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  AndTerm->pExpr->
8f70: 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  op) ){.         
8f80: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
8f90: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  k(pMaskSet, pAnd
8fa0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8fb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
8fc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8fe0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
8ff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
9000: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
9010: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
9020: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
9030: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
9040: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
9050: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
9060: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
9070: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
9080: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
9090: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
90a0: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
90b0: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
90c0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
90d0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
90e0: 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  or);.      if( p
90f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9100: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
9110: 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  {.        WhereT
9120: 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
9130: 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d  OrWc->a[pOrTerm-
9140: 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
9150: 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28     b |= getMask(
9160: 70 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72  pMaskSet, pOther
9170: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
9180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64       }.      ind
9190: 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20  exable &= b;.   
91a0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
91b0: 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51  eOperator!=WO_EQ
91c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
91d0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
91e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
91f0: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
9200: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9210: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
9220: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
9230: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
9240: 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65   case 2.  The se
9250: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
9260: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
9270: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
9280: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
9290: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
92a0: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
92b0: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
92c0: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
92d0: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
92e0: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
92f0: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
9300: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
9310: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
9320: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
9330: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
9340: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
9350: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
9360: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
9370: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
9380: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
9390: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
93a0: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
93b0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
93c0: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
93d0: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
93e0: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
93f0: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
9400: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
9410: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
9420: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
9430: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
9440: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
9450: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
9460: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
9470: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
9480: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
9490: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
94a0: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
94b0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
94c0: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
94d0: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
94e0: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
94f0: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
9500: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
9510: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
9520: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
9530: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
9540: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
9550: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
9560: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
9570: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
9580: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
9590: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
95a0: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
95b0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
95c0: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
95d0: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
95e0: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
95f0: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
9600: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
9610: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
9620: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
9630: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
9640: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
9650: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
9660: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
9670: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
9680: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
9690: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
96a0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
96b0: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
96c0: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
96d0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
96e0: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
96f0: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
9700: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
9710: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
9720: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
9730: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
9740: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
9750: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
9760: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
9770: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
9780: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
9790: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
97a0: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
97b0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
97c0: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
97d0: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
97e0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
97f0: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
9800: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9810: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9820: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
9830: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
9840: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
9850: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
9860: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
9870: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
9880: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
9890: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
98a0: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
98b0: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
98c0: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
98d0: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
98e0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
98f0: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
9900: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
9910: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
9920: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
9930: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
9940: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
9950: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
9960: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
9970: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
9980: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
9990: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
99a0: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
99b0: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
99c0: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
99d0: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
99e0: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
99f0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
9a00: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
9a10: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9a20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
9a30: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _EQ );.        p
9a40: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9a50: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
9a60: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
9a70: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
9a80: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
9a90: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
9aa0: 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   the 2-bit case 
9ab0: 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68  and we are on th
9ac0: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
9ad0: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  on and.         
9ae0: 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d   ** current term
9af0: 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72   is from the fir
9b00: 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53  st iteration.  S
9b10: 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d  o skip this term
9b20: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
9b30: 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20  ssert( j==1 );. 
9b40: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9b50: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
9b60: 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f       if( (chngTo
9b70: 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61  IN & getMask(pMa
9b80: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
9b90: 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20  leftCursor))==0 
9ba0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
9bb0: 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62  This term must b
9bc0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31  e of the form t1
9bd0: 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74  .a==t2.b where t
9be0: 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20  2 is in the.    
9bf0: 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49        ** chngToI
9c00: 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20  N set but t1 is 
9c10: 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20  not.  This term 
9c20: 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70  will be either p
9c30: 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20  receeded.       
9c40: 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64     ** or follwed
9c50: 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20   by an inverted 
9c60: 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61  copy (t2.b==t1.a
9c70: 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65  ).  Skip this te
9c80: 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rm .          **
9c90: 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76   and use its inv
9ca0: 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ersion. */.     
9cb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
9cc0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9cd0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b  & TERM_COPIED );
9ce0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
9cf0: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
9d00: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
9d10: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
9d20: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9d30: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
9d40: 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56  RM_COPIED|TERM_V
9d50: 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20  IRTUAL) );.     
9d60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9d70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9d80: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65   iColumn = pOrTe
9d90: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
9da0: 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f  ;.        iCurso
9db0: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  r = pOrTerm->lef
9dc0: 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  tCursor;.       
9dd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9de0: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b        if( i<0 ){
9df0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  .        /* No c
9e00: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63  andidate table+c
9e10: 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e  olumn was found.
9e20: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
9e30: 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  occur.        **
9e40: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
9e50: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
9e60: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
9e70: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
9e80: 72 74 28 20 28 63 68 6e 67 54 6f 49 4e 26 28 63  rt( (chngToIN&(c
9e90: 68 6e 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29  hngToIN-1))==0 )
9ea0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9eb0: 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d  ( chngToIN==getM
9ec0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43  ask(pMaskSet, iC
9ed0: 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20  ursor) );.      
9ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9ef0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9f00: 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20   j==1 );..      
9f10: 2f 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64  /* We have found
9f20: 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62   a candidate tab
9f30: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20  le and column.  
9f40: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
9f50: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61  that.      ** ta
9f60: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69  ble and column i
9f70: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
9f80: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52  y term in the OR
9f90: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
9fa0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
9fb0: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69  1;.      for(; i
9fc0: 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54  >=0 && okToChngT
9fd0: 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  oIN; i--, pOrTer
9fe0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
9ff0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
a000: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
a010: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
a020: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
a030: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
a040: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
a050: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
a060: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
a070: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
a080: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
a090: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
a0a0: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
a0b0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
a0c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0d0: 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20     int affLeft, 
a0e0: 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20  affRight;.      
a0f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69      /* If the ri
a100: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
a110: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
a120: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
a130: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
a140: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
a150: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
a160: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
a170: 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20  no type.        
a180: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
a190: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
a1a0: 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69   the right.  (Ti
a1b0: 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20  cket #2249).    
a1c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a1d0: 20 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71     affRight = sq
a1e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
a1f0: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
a200: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
a210: 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73       affLeft = s
a220: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
a230: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
a240: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
a250: 20 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68       if( affRigh
a260: 74 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74  t!=0 && affRight
a270: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
a280: 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e           okToChn
a290: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
a2a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a2b0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
a2c0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
a2d0: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
a2e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
a2f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a300: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
a310: 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  t, okToChngToIN 
a320: 69 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69  is true if origi
a330: 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66  nal pTerm satisf
a340: 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  ies.    ** case 
a350: 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  1.  In that case
a360: 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  , construct a ne
a370: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74  w virtual term t
a380: 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70  hat is .    ** p
a390: 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69  Term converted i
a3a0: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
a3b0: 6f 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  or..    **.    *
a3c0: 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35  * EV: R-00211-15
a3d0: 31 30 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  100.    */.    i
a3e0: 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  f( okToChngToIN 
a3f0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
a400: 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dup;            
a410: 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64  /* A transient d
a420: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
a430: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
a440: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
a450: 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f  ;   /* The RHS o
a460: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
a470: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
a480: 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *pLeft = 0;     
a490: 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
a4a0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
a4b0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
a4c0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
a4d0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
a4e0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a  IN operator */..
a4f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
a500: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
a510: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
a520: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
a530: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
a540: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
a550: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
a560: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
a570: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a580: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
a590: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
a5a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
a5b0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
a5c0: 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ==iCursor );.   
a5d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
a5e0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
a5f0: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20  mn==iColumn );. 
a600: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
a610: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a620: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
a630: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
a640: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
a650: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
a660: 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  nd(pWC->pParse, 
a670: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
a680: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f        pLeft = pO
a690: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
a6a0: 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eft;.      }.   
a6b0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
a6c0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75  !=0 );.      pDu
a6d0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
a6e0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
a6f0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
a700: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
a710: 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  se, TK_IN, pDup,
a720: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
a730: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
a740: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
a750: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
a760: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
a770: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
a780: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
a790: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a7a0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
a7b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a7c0: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
a7d0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
a7e0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
a7f0: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
a800: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
a810: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
a820: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
a830: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
a840: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
a850: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
a860: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
a870: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
a880: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
a890: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
a8a0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
a8b0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
a8c0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
a8d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
a8e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
a8f0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
a900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65       }.      pTe
a910: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
a920: 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73  WO_NOOP;  /* cas
a930: 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20  e 1 trumps case 
a940: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  2 */.    }.  }.}
a950: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
a960: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
a970: 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49  IZATION && !SQLI
a980: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
a990: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   */.../*.** The 
a9a0: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
a9b0: 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72  utine is an Wher
a9c0: 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20  eTerm structure 
a9d0: 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  with only the.**
a9e0: 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66   "pExpr" field f
a9f0: 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a  illed in.  The j
aa00: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
aa10: 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65  ne is to analyze
aa20: 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65   the.** subexpre
aa30: 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61  ssion and popula
aa40: 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  te all the other
aa50: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57   fields of the W
aa60: 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75  hereTerm.** stru
aa70: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
aa80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
aa90: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  s of the form "<
aaa0: 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74  expr> <op> X" it
aab0: 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a   gets commuted.*
aac0: 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72  * to the standar
aad0: 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70  d form of "X <op
aae0: 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a  > <expr>"..**.**
aaf0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
ab00: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
ab10: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
ab20: 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20  re both X and Y 
ab30: 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20  are.** columns, 
ab40: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
ab50: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  l expression is 
ab60: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
ab70: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
ab80: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
ab90: 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64  "Y <op> X" is ad
aba0: 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ded to the WHERE
abb0: 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61   clause and.** a
abc0: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
abd0: 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  ly.  The origina
abe0: 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  l term is marked
abf0: 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45   with TERM_COPIE
ac00: 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77  D.** and the new
ac10: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
ac20: 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49  with TERM_DYNAMI
ac30: 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20  C (because it's 
ac40: 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74  pExpr.** needs t
ac50: 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20  o be freed with 
ac60: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29  the WhereClause)
ac70: 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41   and TERM_VIRTUA
ac80: 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a  L (because it.**
ac90: 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63   is a commuted c
aca0: 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74  opy of a prior t
acb0: 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69  erm.)  The origi
acc0: 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68  nal term has nCh
acd0: 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65  ild=1.** and the
ace0: 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72   copy has idxPar
acf0: 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69  ent set to the i
ad00: 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67  ndex of the orig
ad10: 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  inal term..*/.st
ad20: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
ad30: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
ad40: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
ad50: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
ad60: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
ad70: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
ad80: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
ad90: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
ada0: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
adb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
adc0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
add0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
ade0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
adf0: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
ae00: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d       /* The term
ae10: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
ae20: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
ae30: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
ae40: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
ae50: 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b  table index mask
ae60: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  s */.  Expr *pEx
ae70: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
ae80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
ae90: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
aea0: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69  analyzed */.  Bi
aeb0: 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74  tmask prereqLeft
aec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
aed0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
aee0: 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  of the pExpr->pL
aef0: 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  eft */.  Bitmask
af00: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
af10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
af20: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45  requesites of pE
af30: 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  xpr */.  Bitmask
af40: 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b   extraRight = 0;
af50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
af60: 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ra dependencies 
af70: 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a  on LEFT JOIN */.
af80: 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20    Expr *pStr1 = 
af90: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
afa0: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
afb0: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
afc0: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  */.  int isCompl
afd0: 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ete = 0;        
afe0: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
aff0: 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77  LIKE/GLOB ends w
b000: 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a  ith wildcard */.
b010: 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30    int noCase = 0
b020: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b030: 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20     /* LIKE/GLOB 
b040: 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63 61  distinguishes ca
b050: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  se */.  int op; 
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d           /* Top-
b080: 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20  level operator. 
b090: 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20   pExpr->op */.  
b0a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
b0b0: 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  pWC->pParse;    
b0c0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
b0d0: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
b0e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b0f0: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  b;        /* Dat
b100: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b110: 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
b120: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b130: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b140: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
b150: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61  [idxTerm];.  pMa
b160: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
b170: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
b180: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
b190: 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78   prereqLeft = ex
b1a0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
b1b0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c  skSet, pExpr->pL
b1c0: 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78  eft);.  op = pEx
b1d0: 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70  pr->op;.  if( op
b1e0: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61  ==TK_IN ){.    a
b1f0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
b200: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
b210: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
b220: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
b230: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
b240: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
b250: 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74  ght = exprSelect
b260: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
b270: 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Set, pExpr->x.pS
b280: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
b290: 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e{.      pTerm->
b2a0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
b2b0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
b2c0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
b2d0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
b2e0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  }.  }else if( op
b2f0: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
b300: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
b310: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Right = 0;.  }el
b320: 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70  se{.    pTerm->p
b330: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
b340: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
b350: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  kSet, pExpr->pRi
b360: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72  ght);.  }.  prer
b370: 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c  eqAll = exprTabl
b380: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
b390: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45   pExpr);.  if( E
b3a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
b3b0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
b3c0: 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  n) ){.    Bitmas
b3d0: 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k x = getMask(pM
b3e0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  askSet, pExpr->i
b3f0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b  RightJoinTable);
b400: 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c  .    prereqAll |
b410: 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69  = x;.    extraRi
b420: 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f  ght = x-1;  /* O
b430: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  N clause terms m
b440: 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77  ay not be used w
b450: 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20  ith an index.   
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74      ** on left t
b480: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
b490: 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30  OIN.  Ticket #30
b4a0: 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72  15 */.  }.  pTer
b4b0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
b4c0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72  rereqAll;.  pTer
b4d0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
b4e0: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  -1;.  pTerm->iPa
b4f0: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rent = -1;.  pTe
b500: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
b510: 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64  0;.  if( allowed
b520: 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d  Op(op) && (pTerm
b530: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
b540: 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29  prereqLeft)==0 )
b550: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
b560: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
b570: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
b580: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
b590: 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66  ht;.    if( pLef
b5a0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
b5b0: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
b5c0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
b5d0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
b5e0: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74     pTerm->u.left
b5f0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
b600: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
b610: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
b620: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
b630: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
b640: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
b650: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
b660: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
b670: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
b680: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
b690: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
b6a0: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
b6b0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
b6c0: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
b6d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b6e0: 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
b6f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
b700: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
b710: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b720: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
b730: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
b740: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
b750: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e    }.        idxN
b760: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
b770: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70  Insert(pWC, pDup
b780: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
b790: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
b7a0: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77        if( idxNew
b7b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b7c0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57        pNew = &pW
b7d0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
b7e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72        pNew->iPar
b7f0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
b800: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
b810: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
b820: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
b830: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
b840: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
b850: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
b860: 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  D;.      }else{.
b870: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
b880: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
b890: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
b8a0: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
b8b0: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
b8c0: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
b8d0: 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a   = pDup->pLeft;.
b8e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
b8f0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
b900: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
b910: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
b920: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
b930: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
b940: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
b950: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
b960: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
b970: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
b980: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
b990: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
b9a0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
b9b0: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
b9c0: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
b9d0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
b9e0: 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f  atorMask(pDup->o
b9f0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  p);.    }.  }..#
ba00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ba10: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
ba20: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
ba30: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
ba40: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
ba50: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
ba60: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
ba70: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
ba80: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
ba90: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
baa0: 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nts.  For exampl
bab0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
bac0: 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e    a BETWEEN b AN
bad0: 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  D c.  **.  ** is
bae0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a   converted into:
baf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
bb00: 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44  (a BETWEEN b AND
bb10: 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41   c) AND (a>=b) A
bb20: 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20  ND (a<=c).  **. 
bb30: 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20   ** The two new 
bb40: 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
bb50: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
bb60: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
bb70: 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
bb80: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22   new terms are "
bb90: 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65  dynamic" and are
bba0: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65   children of the
bbb0: 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45   original BETWEE
bbc0: 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68  N.  ** term.  Th
bbd0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  at means that if
bbe0: 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72   the BETWEEN ter
bbf0: 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20  m is coded, the 
bc00: 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a  children are.  *
bc10: 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20  * skipped.  Or, 
bc20: 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  if the children 
bc30: 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
bc40: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
bc50: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54  riginal.  ** BET
bc60: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69  WEEN term is ski
bc70: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
bc80: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
bc90: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70  =TK_BETWEEN && p
bca0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
bcb0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
bcc0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
bcd0: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  .pList;.    int 
bce0: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
bcf0: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
bd00: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
bd10: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
bd20: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
bd30: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
bd40: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
bd50: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
bd60: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
bd70: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
bd80: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
bd90: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
bda0: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b  xpr(pParse, ops[
bdb0: 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  i], .           
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
bde0: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
bdf0: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
be20: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
be30: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
be40: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
be50: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
be60: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
be70: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
be80: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
be90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
bea0: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
beb0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
bec0: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
bed0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
bee0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
bef0: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
bf00: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
bf10: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  idxTerm;.    }. 
bf20: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
bf30: 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 2;.  }.#endif
bf40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
bf50: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
bf60: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
bf70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bf80: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
bf90: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
bfa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
bfb0: 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  ERY).  /* Analyz
bfc0: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73  e a term that is
bfd0: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f   composed of two
bfe0: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
bff0: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  s connected by. 
c000: 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   ** an OR operat
c010: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  or..  */.  else 
c020: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
c030: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  K_OR ){.    asse
c040: 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  rt( pWC->op==TK_
c050: 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41  AND );.    exprA
c060: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72  nalyzeOrTerm(pSr
c070: 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29  c, pWC, idxTerm)
c080: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
c090: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c0a0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
c0b0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
c0c0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
c0d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c0e0: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
c0f0: 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e  ION.  /* Add con
c100: 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75  straints to redu
c110: 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
c120: 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72  ace on a LIKE or
c130: 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61   GLOB.  ** opera
c140: 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  tor..  **.  ** A
c150: 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66   like pattern of
c160: 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b   the form "x LIK
c170: 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61  E 'abc%'" is cha
c180: 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72  nged into constr
c190: 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  aints.  **.  ** 
c1a0: 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63           x>='abc
c1b0: 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e  ' AND x<'abd' AN
c1c0: 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a  D x LIKE 'abc%'.
c1d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61    **.  ** The la
c1e0: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
c1f0: 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22  the prefix "abc"
c200: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
c210: 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a  to form the.  **
c220: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
c230: 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20  dition "abd"..  
c240: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70  */.  if( pWC->op
c250: 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20  ==TK_AND .   && 
c260: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61  isLikeOrGlob(pPa
c270: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74  rse, pExpr, &pSt
c280: 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c  r1, &isComplete,
c290: 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20   &noCase).  ){. 
c2a0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20     Expr *pLeft; 
c2b0: 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20        /* LHS of 
c2c0: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
c2d0: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
c2e0: 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20  pStr2;       /* 
c2f0: 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20  Copy of pStr1 - 
c300: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
c310: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
c320: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
c330: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
c340: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
c350: 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20  dxNew1;.    int 
c360: 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 43 6f 6c  idxNew2;.    Col
c370: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
c380: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
c390: 75 65 6e 63 65 20 74 6f 20 75 73 65 20 2a 2f 0a  uence to use */.
c3a0: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
c3b0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
c3c0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
c3d0: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
c3e0: 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30  Dup(db, pStr1, 0
c3f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
c400: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c410: 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b        u8 c, *pC;
c420: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63         /* Last c
c430: 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
c440: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  the first wildca
c450: 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d  rd */.      pC =
c460: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e   (u8*)&pStr2->u.
c470: 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74  zToken[sqlite3St
c480: 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e  rlen30(pStr2->u.
c490: 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20  zToken)-1];.    
c4a0: 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20    c = *pC;.     
c4b0: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
c4c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
c4d0: 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d  int is to increm
c4e0: 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61  ent the last cha
c4f0: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
c500: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
c510: 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75  ** wildcard.  Bu
c520: 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e  t if we incremen
c530: 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c  t '@', that will
c540: 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68   push it into th
c550: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70  e.        ** alp
c560: 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68  habetic range wh
c570: 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73  ere case convers
c580: 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75  ions will mess u
c590: 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  p the .        *
c5a0: 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54  * inequality.  T
c5b0: 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61  o avoid this, ma
c5c0: 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20  ke sure to also 
c5d0: 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20  run the full.   
c5e0: 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20       ** LIKE on 
c5f0: 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78  all candidate ex
c600: 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65  pressions by cle
c610: 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70  aring the isComp
c620: 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20  lete flag.      
c630: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
c640: 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f   c=='A'-1 ) isCo
c650: 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f 2a  mplete = 0;   /*
c660: 20 45 56 3a 20 52 2d 36 34 33 33 39 2d 30 38 32   EV: R-64339-082
c670: 30 37 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20  07 */...        
c680: 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72  c = sqlite3Upper
c690: 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20  ToLower[c];.    
c6a0: 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20    }.      *pC = 
c6b0: 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c + 1;.    }.   
c6c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c6d0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
c6e0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 6e 6f 43  SQLITE_UTF8, noC
c6f0: 61 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a  ase ? "NOCASE" :
c700: 20 22 42 49 4e 41 52 59 22 2c 30 29 3b 0a 20 20   "BINARY",0);.  
c710: 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71    pNewExpr1 = sq
c720: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
c730: 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20  e, TK_GE, .     
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
c760: 6c 6c 28 73 71 6c 69 74 65 33 45 78 70 72 44 75  ll(sqlite3ExprDu
c770: 70 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70  p(db,pLeft,0), p
c780: 43 6f 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20  Coll),.         
c790: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72              pStr
c7a0: 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  1, 0);.    idxNe
c7b0: 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w1 = whereClause
c7c0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
c7d0: 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54  Expr1, TERM_VIRT
c7e0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
c7f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c800: 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20   idxNew1==0 );. 
c810: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
c820: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
c830: 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  1);.    pNewExpr
c840: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
c850: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a  (pParse, TK_LT,.
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c880: 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45  SetColl(sqlite3E
c890: 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c  xprDup(db,pLeft,
c8a0: 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20  0), pColl),.    
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20   pStr2, 0);.    
c8d0: 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
c8e0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
c8f0: 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d   pNewExpr2, TERM
c900: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
c910: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
c920: 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30  case( idxNew2==0
c930: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
c940: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
c950: 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65  dxNew2);.    pTe
c960: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
c970: 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69  Term];.    if( i
c980: 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  sComplete ){.   
c990: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
c9a0: 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  1].iParent = idx
c9b0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d  Term;.      pWC-
c9c0: 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72  >a[idxNew2].iPar
c9d0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
c9e0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
c9f0: 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ld = 2;.    }.  
ca00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ca10: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
ca20: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
ca30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ca40: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
ca50: 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54   /* Add a WO_MAT
ca60: 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72  CH auxiliary ter
ca70: 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61  m to the constra
ca80: 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20  int set if the. 
ca90: 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72   ** current expr
caa0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
cab0: 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d   form:  column M
cac0: 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20  ATCH expr..  ** 
cad0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
cae0: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
caf0: 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
cb00: 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75  ds of.  ** virtu
cb10: 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20  al tables.  The 
cb20: 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74  native query opt
cb30: 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20  imizer does not 
cb40: 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20  attempt.  ** to 
cb50: 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68  do anything with
cb60: 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73   MATCH functions
cb70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d  ..  */.  if( isM
cb80: 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78  atchOfColumn(pEx
cb90: 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  pr) ){.    int i
cba0: 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20  dxNew;.    Expr 
cbb0: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
cbc0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
cbd0: 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69  pNewTerm;.    Bi
cbe0: 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75  tmask prereqColu
cbf0: 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a  mn, prereqExpr;.
cc00: 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45  .    pRight = pE
cc10: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
cc20: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c  0].pExpr;.    pL
cc30: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
cc40: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
cc50: 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72  ;.    prereqExpr
cc60: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
cc70: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67  e(pMaskSet, pRig
cc80: 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43  ht);.    prereqC
cc90: 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c  olumn = exprTabl
cca0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
ccb0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
ccc0: 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70   (prereqExpr & p
ccd0: 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20  rereqColumn)==0 
cce0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
ccf0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70  NewExpr;.      p
cd00: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
cd10: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
cd20: 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20  K_MATCH, .      
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
cd50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52  e3ExprDup(db, pR
cd60: 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20  ight, 0), 0);.  
cd70: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
cd80: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
cd90: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
cda0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
cdb0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
cdc0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
cdd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
cde0: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
cdf0: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
ce00: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
ce10: 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70  ight = prereqExp
ce20: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  r;.      pNewTer
ce30: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
ce40: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
ce50: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
ce60: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
ce70: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
ce80: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
ce90: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54  perator = WO_MAT
cea0: 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  CH;.      pNewTe
ceb0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
cec0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
ced0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
cee0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
cef0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
cf00: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
cf10: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
cf20: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
cf30: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
cf40: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
cf50: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
cf60: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cf70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
cf80: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
cf90: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
cfa0: 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f   /* When sqlite_
cfb0: 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
cfc0: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
cfd0: 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66  e an operator of
cfe0: 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22   the.  ** form "
cff0: 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63  x IS NOT NULL" c
d000: 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
d010: 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65  evaluated more e
d020: 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20  fficiently.  ** 
d030: 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78  as "x>NULL" if x
d040: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
d050: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ER PRIMARY KEY. 
d060: 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a   So construct a.
d070: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72    ** virtual ter
d080: 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a  m of that form..
d090: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
d0a0: 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  hat the virtual 
d0b0: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67  term must be tag
d0c0: 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e  ged with TERM_VN
d0d0: 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ULL.  This.  ** 
d0e0: 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77  TERM_VNULL tag w
d0f0: 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65  ill suppress the
d100: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
d110: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
d120: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f  .  ** of the loo
d130: 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20  p.  Without the 
d140: 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c  TERM_VNULL flag,
d150: 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68   the not-null ch
d160: 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  eck at.  ** the 
d170: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f  start of the loo
d180: 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61  p will prevent a
d190: 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ny results from 
d1a0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
d1b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
d1c0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
d1d0: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
d1e0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
d1f0: 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
d200: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pLeft->iColumn>=
d210: 30 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20  0.  ){.    Expr 
d220: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45  *pNewExpr;.    E
d230: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
d240: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69  pr->pLeft;.    i
d250: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57  nt idxNew;.    W
d260: 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65  hereTerm *pNewTe
d270: 72 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70  rm;..    pNewExp
d280: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
d290: 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a  (pParse, TK_GT,.
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d2c0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
d2d0: 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Left, 0),.      
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 45 78        sqlite3PEx
d300: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55  pr(pParse, TK_NU
d310: 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29  LL, 0, 0, 0), 0)
d320: 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20  ;..    idxNew = 
d330: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
d340: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
d350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
d370: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
d380: 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e  _DYNAMIC|TERM_VN
d390: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64  ULL);.    if( id
d3a0: 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  xNew ){.      pN
d3b0: 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
d3c0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
d3d0: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
d3e0: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20  Right = 0;.     
d3f0: 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43   pNewTerm->leftC
d400: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
d410: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
d420: 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  wTerm->u.leftCol
d430: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
d440: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77  lumn;.      pNew
d450: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
d460: 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70  = WO_GT;.      p
d470: 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
d480: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
d490: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
d4a0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
d4b0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
d4c0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  = 1;.      pTerm
d4d0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
d4e0: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
d4f0: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
d500: 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
d510: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
d520: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d530: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a  TE_ENABLE_STAT *
d540: 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  /..  /* Prevent 
d550: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
d560: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66  of a LEFT JOIN f
d570: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74  rom being used t
d580: 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20  o drive.  ** an 
d590: 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73  index for tables
d5a0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
d5b0: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
d5c0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
d5d0: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
d5e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
d5f0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
d600: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
d610: 6e 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n list passed as
d620: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
d630: 6d 65 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 20 65  ment.** for an e
d640: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 79 70  xpression of typ
d650: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74  e TK_COLUMN that
d660: 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 73   refers to the s
d670: 61 6d 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a  ame column and.*
d680: 2a 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20  * uses the same 
d690: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
d6a0: 63 65 20 61 73 20 74 68 65 20 69 43 6f 6c 27 74  ce as the iCol't
d6b0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  h column of inde
d6c0: 78 20 70 49 64 78 2e 0a 2a 2a 20 41 72 67 75 6d  x pIdx..** Argum
d6d0: 65 6e 74 20 69 42 61 73 65 20 69 73 20 74 68 65  ent iBase is the
d6e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 75   cursor number u
d6f0: 73 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sed for the tabl
d700: 65 20 74 68 61 74 20 70 49 64 78 20 72 65 66 65  e that pIdx refe
d710: 72 73 0a 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  rs.** to..**.** 
d720: 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65  If such an expre
d730: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
d740: 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  its index in pLi
d750: 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72  st->a[] is retur
d760: 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78  ned. If.** no ex
d770: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
d780: 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
d790: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d7a0: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20   findIndexCol(. 
d7b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
d7e0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d7f0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
d800: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
d810: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61  sion list to sea
d820: 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  rch */.  int iBa
d830: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
d840: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
d850: 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73  or for table ass
d860: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
d870: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
d880: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
d890: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
d8a0: 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  to match column 
d8b0: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  of */.  int iCol
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
d8e0: 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61  n of index to ma
d8f0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
d900: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
d910: 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
d920: 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20  zColl[iCol];..  
d930: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
d940: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d950: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 4c 69     Expr *p = pLi
d960: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
d970: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
d980: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  K_COLUMN.     &&
d990: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64   p->iColumn==pId
d9a0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
d9b0: 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61  ].     && p->iTa
d9c0: 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29  ble==iBase.    )
d9d0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
d9e0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
d9f0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
da00: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
da10: 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
da20: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
da30: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
da40: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
da50: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
da60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
da70: 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
da80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
da90: 74 69 6e 65 20 64 65 74 65 72 6d 69 6e 65 73 20  tine determines 
daa0: 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
dab0: 73 65 64 20 74 6f 20 61 73 73 69 73 74 20 69 6e  sed to assist in
dac0: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
dad0: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
dae0: 69 65 72 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  ier. In other wo
daf0: 72 64 73 2c 20 69 74 20 74 65 73 74 73 20 77 68  rds, it tests wh
db00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 75 73 69  ether or not usi
db10: 6e 67 20 74 68 69 73 0a 2a 2a 20 69 6e 64 65 78  ng this.** index
db20: 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c   for the outer l
db30: 6f 6f 70 20 67 75 61 72 61 6e 74 65 65 73 20 74  oop guarantees t
db40: 68 61 74 20 72 6f 77 73 20 77 69 74 68 20 65 71  hat rows with eq
db50: 75 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  ual values for.*
db60: 2a 20 61 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e  * all expression
db70: 73 20 69 6e 20 74 68 65 20 70 44 69 73 74 69 6e  s in the pDistin
db80: 63 74 20 6c 69 73 74 20 61 72 65 20 64 65 6c 69  ct list are deli
db90: 76 65 72 65 64 20 67 72 6f 75 70 65 64 20 74 6f  vered grouped to
dba0: 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f  gether..**.** Fo
dbb0: 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71  r example, the q
dbc0: 75 65 72 79 20 0a 2a 2a 0a 2a 2a 20 20 20 53 45  uery .**.**   SE
dbd0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 61 2c  LECT DISTINCT a,
dbe0: 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57   b, c FROM tbl W
dbf0: 48 45 52 45 20 61 20 3d 20 3f 0a 2a 2a 0a 2a 2a  HERE a = ?.**.**
dc00: 20 63 61 6e 20 62 65 6e 65 66 69 74 20 66 72 6f   can benefit fro
dc10: 6d 20 61 6e 79 20 69 6e 64 65 78 20 6f 6e 20 63  m any index on c
dc20: 6f 6c 75 6d 6e 73 20 22 62 22 20 61 6e 64 20 22  olumns "b" and "
dc30: 63 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  c"..*/.static in
dc40: 74 20 69 73 44 69 73 74 69 6e 63 74 49 6e 64 65  t isDistinctInde
dc50: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
dc60: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
dc70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
dc80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
dc90: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcb0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
dcc0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
dcd0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
dce0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
dcf0: 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  ex being conside
dd00: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  red */.  int bas
dd10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
dd20: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
dd30: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
dd40: 65 20 74 61 62 6c 65 20 70 49 64 78 20 69 73 20  e table pIdx is 
dd50: 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
dd60: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 20 20   *pDistinct,    
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44          /* The D
dd80: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
dd90: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  ons */.  int nEq
dda0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
ddb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ddc0: 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75  er of index colu
ddd0: 6d 6e 73 20 77 69 74 68 20 3d 3d 20 2a 2f 0a 29  mns with == */.)
dde0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
ddf0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
de00: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75      /* Mask of u
de10: 6e 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20 70  naccounted for p
de20: 44 69 73 74 69 6e 63 74 20 65 78 70 72 73 20 2a  Distinct exprs *
de30: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
de60: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61  variable */..  a
de70: 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74  ssert( pDistinct
de80: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 49 64  !=0 );.  if( pId
de90: 78 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70  x->zName==0 || p
dea0: 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3e  Distinct->nExpr>
deb0: 3d 42 4d 53 20 29 20 72 65 74 75 72 6e 20 30 3b  =BMS ) return 0;
dec0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 44 69  .  testcase( pDi
ded0: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3d 3d 42  stinct->nExpr==B
dee0: 4d 53 2d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  MS-1 );..  /* Lo
def0: 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74  op through all t
df00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
df10: 6e 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 6c  n the distinct l
df20: 69 73 74 2e 20 49 66 20 61 6e 79 20 6f 66 20 74  ist. If any of t
df30: 68 65 6d 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74  hem.  ** are not
df40: 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20 72   simple column r
df50: 65 66 65 72 65 6e 63 65 73 2c 20 72 65 74 75 72  eferences, retur
df60: 6e 20 65 61 72 6c 79 2e 20 4f 74 68 65 72 77 69  n early. Otherwi
df70: 73 65 2c 20 74 65 73 74 20 69 66 20 74 68 65 0a  se, test if the.
df80: 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73    ** WHERE claus
df90: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f  e contains a "co
dfa0: 6c 3d 58 22 20 63 6c 61 75 73 65 2e 20 49 66 20  l=X" clause. If 
dfb0: 69 74 20 64 6f 65 73 2c 20 74 68 65 20 65 78 70  it does, the exp
dfc0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 63 61 6e  ression.  ** can
dfd0: 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 49 66 20   be ignored. If 
dfe0: 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 61 6e 64  it does not, and
dff0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 6f 65 73   the column does
e000: 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74   not belong to t
e010: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
e020: 6c 65 20 61 73 20 69 6e 64 65 78 20 70 49 64 78  le as index pIdx
e030: 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
e040: 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 72  Finally, if ther
e050: 65 20 69 73 20 6e 6f 0a 20 20 2a 2a 20 6d 61 74  e is no.  ** mat
e060: 63 68 69 6e 67 20 22 63 6f 6c 3d 58 22 20 65 78  ching "col=X" ex
e070: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65  pression and the
e080: 20 63 6f 6c 75 6d 6e 20 69 73 20 6f 6e 20 74 68   column is on th
e090: 65 20 73 61 6d 65 20 74 61 62 6c 65 20 61 73 20  e same table as 
e0a0: 70 49 64 78 2c 0a 20 20 2a 2a 20 73 65 74 20 74  pIdx,.  ** set t
e0b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
e0c0: 20 62 69 74 20 69 6e 20 76 61 72 69 61 62 6c 65   bit in variable
e0d0: 20 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 66 6f   mask..  */.  fo
e0e0: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
e0f0: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
e100: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
e110: 70 54 65 72 6d 3b 0a 20 20 20 20 45 78 70 72 20  pTerm;.    Expr 
e120: 2a 70 20 3d 20 70 44 69 73 74 69 6e 63 74 2d 3e  *p = pDistinct->
e130: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
e140: 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  if( p->op!=TK_CO
e150: 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
e160: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
e170: 64 54 65 72 6d 28 70 57 43 2c 20 70 2d 3e 69 54  dTerm(pWC, p->iT
e180: 61 62 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  able, p->iColumn
e190: 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57  , ~(Bitmask)0, W
e1a0: 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_EQ, 0);.    if
e1b0: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ( pTerm ){.     
e1c0: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
e1d0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
e1e0: 43 6f 6c 6c 53 65 71 20 2a 70 31 20 3d 20 73 71  CollSeq *p1 = sq
e1f0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
e200: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
e210: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
e220: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
e230: 43 6f 6c 6c 53 65 71 20 2a 70 32 20 3d 20 73 71  CollSeq *p2 = sq
e240: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e250: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
e260: 20 20 20 69 66 28 20 70 31 3d 3d 70 32 20 29 20     if( p1==p2 ) 
e270: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
e280: 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c      if( p->iTabl
e290: 65 21 3d 62 61 73 65 20 29 20 72 65 74 75 72 6e  e!=base ) return
e2a0: 20 30 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   0;.    mask |= 
e2b0: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c  (((Bitmask)1) <<
e2c0: 20 69 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28   i);.  }..  for(
e2d0: 69 3d 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b 20 26  i=nEqCol; mask &
e2e0: 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  & i<pIdx->nColum
e2f0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
e300: 20 69 45 78 70 72 20 3d 20 66 69 6e 64 49 6e 64   iExpr = findInd
e310: 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44  exCol(pParse, pD
e320: 69 73 74 69 6e 63 74 2c 20 62 61 73 65 2c 20 70  istinct, base, p
e330: 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  Idx, i);.    if(
e340: 20 69 45 78 70 72 3c 30 20 29 20 62 72 65 61 6b   iExpr<0 ) break
e350: 3b 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28  ;.    mask &= ~(
e360: 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20  ((Bitmask)1) << 
e370: 69 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  iExpr);.  }..  r
e380: 65 74 75 72 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b  eturn (mask==0);
e390: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
e3a0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  n true if the DI
e3b0: 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f  STINCT expressio
e3c0: 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n-list passed as
e3d0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
e3e0: 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64  ent.** is redund
e3f0: 61 6e 74 2e 20 41 20 44 49 53 54 49 4e 43 54 20  ant. A DISTINCT 
e400: 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e  list is redundan
e410: 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  t if the databas
e420: 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  e contains a.** 
e430: 55 4e 49 51 55 45 20 69 6e 64 65 78 20 74 68 61  UNIQUE index tha
e440: 74 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  t guarantees tha
e450: 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
e460: 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62  the query will b
e470: 65 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61 6e  e distinct.** an
e480: 79 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  yway..*/.static 
e490: 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65  int isDistinctRe
e4a0: 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65  dundant(.  Parse
e4b0: 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 72 63 4c   *pParse,.  SrcL
e4c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a 20  ist *pTabList,. 
e4d0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
e4e0: 43 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  C,.  ExprList *p
e4f0: 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54 61  Distinct.){.  Ta
e500: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
e510: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
e520: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e530: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69              .  i
e540: 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20  nt iBase;..  /* 
e550: 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65  If there is more
e560: 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20   than one table 
e570: 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e  or sub-select in
e580: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
e590: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75   of.  ** this qu
e5a0: 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  ery, then it wil
e5b0: 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
e5c0: 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74  e to show that t
e5d0: 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a  he DISTINCT .  *
e5e0: 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75  * clause is redu
e5f0: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ndant. */.  if( 
e600: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d  pTabList->nSrc!=
e610: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
e620: 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74  iBase = pTabList
e630: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[0].iCursor;.
e640: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
e650: 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  t->a[0].pTab;.. 
e660: 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   /* If any of th
e670: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73  e expressions is
e680: 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f   an IPK column o
e690: 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74  n table iBase, t
e6a0: 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a  hen return .  **
e6b0: 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65   true. Note: The
e6c0: 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61   (p->iTable==iBa
e6d0: 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73  se) part of this
e6e0: 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c   test may be fal
e6f0: 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  se if the.  ** c
e700: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73  urrent SELECT is
e710: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
e720: 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  b-query..  */.  
e730: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74  for(i=0; i<pDist
e740: 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  inct->nExpr; i++
e750: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
e760: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d   pDistinct->a[i]
e770: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
e780: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
e790: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
e7a0: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
e7b0: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
e7c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
e7d0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
e7e0: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
e7f0: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
e800: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
e810: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
e820: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
e830: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
e840: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
e850: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
e860: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
e870: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
e880: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
e890: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
e8a0: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
e8b0: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
e8c0: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
e8d0: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
e8e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e8f0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
e900: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
e910: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
e920: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
e930: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
e940: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
e950: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
e960: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
e970: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
e980: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
e990: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
e9a0: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
e9b0: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
e9c0: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
e9d0: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
e9e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e9f0: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
ea00: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
ea10: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
ea20: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
ea30: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
ea40: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
ea50: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ea60: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ea70: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
ea80: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
ea90: 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
eaa0: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
eab0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
eac0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
ead0: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
eae0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
eaf0: 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d   if( 0==findTerm
eb00: 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f  (pWC, iBase, iCo
eb10: 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  l, ~(Bitmask)0, 
eb20: 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a  WO_EQ, pIdx) ){.
eb30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
eb40: 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43  Col = findIndexC
eb50: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
eb60: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
eb70: 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  x, i);.        i
eb80: 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20  f( iIdxCol<0 || 
eb90: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
eba0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f  >aiColumn[i]].no
ebb0: 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
ebc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ebd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ebe0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
ebf0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
ec00: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
ec10: 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61  ndex implies tha
ec20: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  t the DISTINCT q
ec30: 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64 75  ualifier is redu
ec40: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ndant. */.      
ec50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ec60: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
ec70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
ec80: 65 20 61 20 63 72 75 64 65 20 65 73 74 69 6d 61  e a crude estima
ec90: 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69  te of the logari
eca0: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
ecb0: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
ecc0: 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20  esults need not 
ecd0: 62 65 20 65 78 61 63 74 2e 20 20 54 68 69 73 20  be exact.  This 
ece0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
ecf0: 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74   estimating.** t
ed00: 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66  he total cost of
ed10: 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72   performing oper
ed20: 61 74 69 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f  ations with O(lo
ed30: 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a  gN) or O(NlogN).
ed40: 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20  ** complexity.  
ed50: 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73  Because N is jus
ed60: 74 20 61 20 67 75 65 73 73 2c 20 69 74 20 69 73  t a guess, it is
ed70: 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65 64   no great traged
ed80: 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20  y if.** logN is 
ed90: 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f  a little off..*/
eda0: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65  .static double e
edb0: 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b  stLog(double N){
edc0: 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d  .  double logN =
edd0: 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d   1;.  double x =
ede0: 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e   10;.  while( N>
edf0: 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d  x ){.    logN +=
ee00: 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b   1;.    x *= 10;
ee10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f  .  }.  return lo
ee20: 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f  gN;.}../*.** Two
ee30: 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72   routines for pr
ee40: 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  inting the conte
ee50: 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33  nt of an sqlite3
ee60: 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73  _index_info.** s
ee70: 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20  tructure.  Used 
ee80: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
ee90: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
eea0: 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53   If neither.** S
eeb0: 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51  QLITE_TEST or SQ
eec0: 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64  LITE_DEBUG are d
eed0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
eee0: 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61  se routines.** a
eef0: 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69  re no-ops..*/.#i
ef00: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ef10: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
ef20: 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
ef30: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
ef40: 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
ef50: 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74  IDX_INPUTS(sqlit
ef60: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
ef70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
ef80: 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
ef90: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
efa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
efb0: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
efc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
efd0: 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
efe0: 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
eff0: 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
f000: 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
f010: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
f020: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
f030: 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
f040: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
f050: 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
f060: 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
f070: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
f080: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
f090: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
f0a0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
f0b0: 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
f0c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
f0d0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f0e0: 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
f0f0: 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
f100: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
f110: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
f120: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
f130: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
f140: 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
f150: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
f160: 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
f170: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
f180: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
f190: 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
f1a0: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
f1b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f1c0: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
f1d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
f1e0: 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67  ugPrintf("  usag
f1f0: 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25  e[%d]: argvIdx=%
f200: 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20  d omit=%d\n",.  
f210: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
f220: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
f230: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c  ge[i].argvIndex,
f240: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
f250: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
f260: 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mit);.  }.  sqli
f270: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f280: 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20    idxNum=%d\n", 
f290: 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71  p->idxNum);.  sq
f2a0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f2b0: 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22  ("  idxStr=%s\n"
f2c0: 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  , p->idxStr);.  
f2d0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f2e0: 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e  tf("  orderByCon
f2f0: 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e  sumed=%d\n", p->
f300: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
f310: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
f320: 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
f330: 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70  tedCost=%g\n", p
f340: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
f350: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
f360: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
f370: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
f380: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
f390: 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  A).#endif../* .*
f3a0: 2a 20 52 65 71 75 69 72 65 64 20 62 65 63 61 75  * Required becau
f3b0: 73 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 69  se bestIndex() i
f3c0: 73 20 63 61 6c 6c 65 64 20 62 79 20 62 65 73 74  s called by best
f3d0: 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 29 20  OrClauseIndex() 
f3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f3f0: 62 65 73 74 49 6e 64 65 78 28 57 68 65 72 65 42  bestIndex(WhereB
f400: 65 73 74 49 64 78 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  estIdx*);../*.**
f410: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
f420: 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 61  tempts to find a
f430: 6e 20 73 63 61 6e 6e 69 6e 67 20 73 74 72 61 74  n scanning strat
f440: 65 67 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  egy that can be 
f450: 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74 69  used .** to opti
f460: 6d 69 7a 65 20 61 6e 20 27 4f 52 27 20 65 78 70  mize an 'OR' exp
f470: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
f480: 70 61 72 74 20 6f 66 20 61 20 57 48 45 52 45 20  part of a WHERE 
f490: 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54  clause. .**.** T
f4a0: 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  he table associa
f4b0: 74 65 64 20 77 69 74 68 20 46 52 4f 4d 20 63 6c  ted with FROM cl
f4c0: 61 75 73 65 20 74 65 72 6d 20 70 53 72 63 20 6d  ause term pSrc m
f4d0: 61 79 20 62 65 20 65 69 74 68 65 72 20 61 0a 2a  ay be either a.*
f4e0: 2a 20 72 65 67 75 6c 61 72 20 42 2d 54 72 65 65  * regular B-Tree
f4f0: 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74   table or a virt
f500: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
f510: 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 4f 72  atic void bestOr
f520: 43 6c 61 75 73 65 49 6e 64 65 78 28 57 68 65 72  ClauseIndex(Wher
f530: 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 23 69  eBestIdx *p){.#i
f540: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f550: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
f560: 4e 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  N.  WhereClause 
f570: 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20  *pWC = p->pWC;  
f580: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f590: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
f5a0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
f5b0: 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d  _item *pSrc = p-
f5c0: 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20 46 52  >pSrc; /* The FR
f5d0: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
f5e0: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f  o search */.  co
f5f0: 6e 73 74 20 69 6e 74 20 69 43 75 72 20 3d 20 70  nst int iCur = p
f600: 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20  Src->iCursor;   
f610: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
f620: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 20 2a   of the table  *
f630: 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d 61 73  /.  const Bitmas
f640: 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d  k maskSrc = getM
f650: 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
f660: 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20 42 69  t, iCur);  /* Bi
f670: 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63 20 2a  tmask for pSrc *
f680: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20  /.  WhereTerm * 
f690: 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d 20 26  const pWCEnd = &
f6a0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
f6b0: 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  m];        /* En
f6c0: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
f6d0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
f6e0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
f6f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
f700: 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
f710: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
f720: 0a 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61  .  /* The OR-cla
f730: 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  use optimization
f740: 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 69   is disallowed i
f750: 66 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  f the INDEXED BY
f760: 20 6f 72 0a 20 20 2a 2a 20 4e 4f 54 20 49 4e 44   or.  ** NOT IND
f770: 45 58 45 44 20 63 6c 61 75 73 65 73 20 61 72 65  EXED clauses are
f780: 20 75 73 65 64 20 6f 72 20 69 66 20 74 68 65 20   used or if the 
f790: 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 62  WHERE_AND_ONLY b
f7a0: 69 74 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20  it is set. */.  
f7b0: 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
f7c0: 65 78 65 64 20 7c 7c 20 70 53 72 63 2d 3e 70 49  exed || pSrc->pI
f7d0: 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 72  ndex!=0 ){.    r
f7e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
f7f0: 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73   pWC->wctrlFlags
f800: 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   & WHERE_AND_ONL
f810: 59 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  Y ){.    return;
f820: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
f830: 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
f840: 73 65 20 74 65 72 6d 73 20 66 6f 72 20 61 20 75  se terms for a u
f850: 73 61 62 6c 65 20 57 4f 5f 4f 52 20 74 65 72 6d  sable WO_OR term
f860: 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d  . */.  for(pTerm
f870: 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
f880: 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
f890: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
f8a0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
f8b0: 20 0a 20 20 20 20 20 26 26 20 28 28 70 54 65 72   .     && ((pTer
f8c0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e  m->prereqAll & ~
f8d0: 6d 61 73 6b 53 72 63 29 20 26 20 70 2d 3e 6e 6f  maskSrc) & p->no
f8e0: 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20  tReady)==0.     
f8f0: 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
f900: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
f910: 26 20 6d 61 73 6b 53 72 63 29 21 3d 30 20 0a 20  & maskSrc)!=0 . 
f920: 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
f930: 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
f940: 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
f950: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
f960: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
f970: 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
f980: 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
f990: 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
f9a0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
f9b0: 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  erm;.      int f
f9c0: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
f9d0: 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 64 6f 75  TI_OR;.      dou
f9e0: 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a  ble rTotal = 0;.
f9f0: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f        double nRo
fa00: 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74  w = 0;.      Bit
fa10: 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 20  mask used = 0;. 
fa20: 20 20 20 20 20 57 68 65 72 65 42 65 73 74 49 64       WhereBestId
fa30: 78 20 73 42 4f 49 3b 0a 0a 20 20 20 20 20 20 73  x sBOI;..      s
fa40: 42 4f 49 20 3d 20 2a 70 3b 0a 20 20 20 20 20 20  BOI = *p;.      
fa50: 73 42 4f 49 2e 70 4f 72 64 65 72 42 79 20 3d 20  sBOI.pOrderBy = 
fa60: 30 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e 70 44  0;.      sBOI.pD
fa70: 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
fa80: 20 20 20 73 42 4f 49 2e 70 70 49 64 78 49 6e 66     sBOI.ppIdxInf
fa90: 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  o = 0;.      for
faa0: 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
fab0: 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  a; pOrTerm<pOrWC
fac0: 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
fad0: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
fae0: 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d  ACE(("... Multi-
faf0: 69 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67  index OR testing
fb00: 20 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20   for term %d of 
fb10: 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20  %d....\n", .    
fb20: 20 20 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d        (pOrTerm -
fb30: 20 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65   pOrWC->a), (pTe
fb40: 72 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20  rm - pWC->a).   
fb50: 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20       ));.       
fb60: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f   if( pOrTerm->eO
fb70: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20  perator==WO_AND 
fb80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 42 4f  ){.          sBO
fb90: 49 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  I.pWC = &pOrTerm
fba0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
fbb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
fbc0: 49 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a 20 20  Index(&sBOI);.  
fbd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fbe0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
fbf0: 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20  sor==iCur ){.   
fc00: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
fc10: 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  se tempWC;.     
fc20: 20 20 20 20 20 74 65 6d 70 57 43 2e 70 50 61 72       tempWC.pPar
fc30: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
fc40: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
fc50: 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  WC.pMaskSet = pW
fc60: 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20  C->pMaskSet;.   
fc70: 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f         tempWC.pO
fc80: 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
fc90: 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20        tempWC.op 
fca0: 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
fcb0: 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
fcc0: 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
fcd0: 20 20 74 65 6d 70 57 43 2e 77 63 74 72 6c 46 6c    tempWC.wctrlFl
fce0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ags = 0;.       
fcf0: 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
fd00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
fd10: 42 4f 49 2e 70 57 43 20 3d 20 26 74 65 6d 70 57  BOI.pWC = &tempW
fd20: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  C;.          bes
fd30: 74 49 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a 20  tIndex(&sBOI);. 
fd40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
fd50: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
fd60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fd70: 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 42      rTotal += sB
fd80: 4f 49 2e 63 6f 73 74 2e 72 43 6f 73 74 3b 0a 20  OI.cost.rCost;. 
fd90: 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73         nRow += s
fda0: 42 4f 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52  BOI.cost.plan.nR
fdb0: 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73 65 64  ow;.        used
fdc0: 20 7c 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 75 73   |= sBOI.cost.us
fdd0: 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
fde0: 72 54 6f 74 61 6c 3e 3d 70 2d 3e 63 6f 73 74 2e  rTotal>=p->cost.
fdf0: 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20  rCost ) break;. 
fe00: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
fe10: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
fe20: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
fe30: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 63   increase the sc
fe40: 61 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75  an cost to accou
fe50: 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  nt .      ** for
fe60: 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
fe70: 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20   sort. */.      
fe80: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  if( p->pOrderBy!
fe90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 48  =0 ){.        WH
fea0: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73  ERETRACE(("... s
feb0: 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73  orting increases
fec0: 20 4f 52 20 63 6f 73 74 20 25 2e 39 67 20 74 6f   OR cost %.9g to
fed0: 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20   %.9g\n",.      
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 54                rT
fef0: 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f  otal, rTotal+nRo
ff00: 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 29 29  w*estLog(nRow)))
ff10: 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c  ;.        rTotal
ff20: 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28   += nRow*estLog(
ff30: 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  nRow);.      }..
ff40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ff50: 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67  cost of scanning
ff60: 20 75 73 69 6e 67 20 74 68 69 73 20 4f 52 20 74   using this OR t
ff70: 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61  erm for optimiza
ff80: 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  tion is.      **
ff90: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 63   less than the c
ffa0: 75 72 72 65 6e 74 20 63 6f 73 74 20 73 74 6f 72  urrent cost stor
ffb0: 65 64 20 69 6e 20 70 43 6f 73 74 2c 20 72 65 70  ed in pCost, rep
ffc0: 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
ffd0: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 43  s.      ** of pC
ffe0: 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48  ost. */.      WH
fff0: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d  ERETRACE(("... m
10000 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f  ulti-index OR co
10010 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39  st=%.9g nrow=%.9
10020 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52  g\n", rTotal, nR
10030 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ow));.      if( 
10040 72 54 6f 74 61 6c 3c 70 2d 3e 63 6f 73 74 2e 72  rTotal<p->cost.r
10050 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
10060 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20  p->cost.rCost = 
10070 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20  rTotal;.        
10080 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20 75  p->cost.used = u
10090 73 65 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  sed;.        p->
100a0 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  cost.plan.nRow =
100b0 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70   nRow;.        p
100c0 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53  ->cost.plan.nOBS
100d0 61 74 20 3d 20 70 2d 3e 69 20 3f 20 70 2d 3e 61  at = p->i ? p->a
100e0 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c  Level[p->i-1].pl
100f0 61 6e 2e 6e 4f 42 53 61 74 20 3a 20 30 3b 0a 20  an.nOBSat : 0;. 
10100 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70         p->cost.p
10110 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c  lan.wsFlags = fl
10120 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ags;.        p->
10130 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 54 65 72  cost.plan.u.pTer
10140 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
10150 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
10160 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10170 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
10180 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66  ON */.}..#ifndef
10190 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
101a0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
101b0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
101c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
101d0 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
101e0 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
101f0 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
10200 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
10210 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
10220 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
10230 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
10240 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
10250 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
10260 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
10270 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
10280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10290 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
102a0 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
102b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
102c0 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
102d0 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
102e0 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
102f0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
10300 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
10310 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
10320 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
10330 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
10340 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
10350 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
10360 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
10370 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
10380 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
10390 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20  erator!=WO_EQ ) 
103a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
103b0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
103c0 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
103d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
103e0 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
103f0 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
10400 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
10410 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
10420 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
10430 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
10440 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
10450 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
10460 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
10470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10480 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
10490 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
104a0 20 70 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73   plan for pSrc s
104b0 70 65 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73  pecified in pCos
104c0 74 20 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c  t is a full tabl
104d0 65 20 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e  e scan.** and in
104e0 64 65 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73  dexing is allows
104f0 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f   (if there is no
10500 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
10510 75 73 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70  use) and it.** p
10520 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74  ossible to const
10530 72 75 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74  ruct a transient
10540 20 69 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c   index that woul
10550 64 20 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72  d perform better
10560 0a 2a 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20  .** than a full 
10570 74 61 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20  table scan even 
10580 77 68 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  when the cost of
10590 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68   constructing th
105a0 65 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61  e index.** is ta
105b0 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  ken into account
105c0 2c 20 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65  , then alter the
105d0 20 71 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75   query plan to u
105e0 73 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69  se the.** transi
105f0 65 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ent index..*/.st
10600 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 41 75  atic void bestAu
10610 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 57 68 65  tomaticIndex(Whe
10620 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20  reBestIdx *p){. 
10630 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
10640 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20   p->pParse;     
10650 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10660 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10670 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
10680 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20 20  pWC = p->pWC;   
10690 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
106a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
106b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
106c0 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d  _item *pSrc = p-
106d0 3e 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  >pSrc;  /* The F
106e0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
106f0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 64  to search */.  d
10700 6f 75 62 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b  ouble nTableRow;
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20       /* Rows in 
10730 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20  the input table 
10740 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e  */.  double logN
10750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
10770 67 28 6e 54 61 62 6c 65 52 6f 77 29 20 2a 2f 0a  g(nTableRow) */.
10780 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 54 65 6d    double costTem
10790 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIdx;         /*
107a0 20 70 65 72 2d 71 75 65 72 79 20 63 6f 73 74 20   per-query cost 
107b0 6f 66 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  of the transient
107c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
107d0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
107e0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
107f0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
10800 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
10810 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
10820 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
10830 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
10840 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
10850 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
10860 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 74 20 6d    /* Table tht m
10870 69 67 68 74 20 62 65 20 69 6e 64 65 78 65 64 20  ight be indexed 
10880 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  */..  if( pParse
10890 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3c 3d 28 64  ->nQueryLoop<=(d
108a0 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 2f  ouble)1 ){.    /
108b0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  * There is no po
108c0 69 6e 74 20 69 6e 20 62 75 69 6c 64 69 6e 67 20  int in building 
108d0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
108e0 65 78 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ex for a single 
108f0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75  scan */.    retu
10900 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  rn;.  }.  if( (p
10910 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
10920 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   & SQLITE_AutoIn
10930 64 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  dex)==0 ){.    /
10940 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69  * Automatic indi
10950 63 65 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  ces are disabled
10960 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 2a 2f 0a   at run-time */.
10970 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10980 20 20 69 66 28 20 28 70 2d 3e 63 6f 73 74 2e 70    if( (p->cost.p
10990 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
109a0 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
109b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  )!=0 ){.    /* W
109c0 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 73  e already have s
109d0 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 69 6e 64 65  ome kind of inde
109e0 78 20 69 6e 20 75 73 65 20 66 6f 72 20 74 68 69  x in use for thi
109f0 73 20 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20  s query. */.    
10a00 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
10a10 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
10a20 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
10a30 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
10a40 75 73 65 20 61 70 70 65 61 72 73 20 69 6e 20 74  use appears in t
10a50 68 65 20 53 51 4c 2e 20 2a 2f 0a 20 20 20 20 72  he SQL. */.    r
10a60 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
10a70 20 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61   pSrc->isCorrela
10a80 74 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ted ){.    /* Th
10a90 65 20 73 6f 75 72 63 65 20 69 73 20 61 20 63 6f  e source is a co
10aa0 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65  rrelated sub-que
10ab0 72 79 2e 20 4e 6f 20 70 6f 69 6e 74 20 69 6e 20  ry. No point in 
10ac0 69 6e 64 65 78 69 6e 67 20 69 74 2e 20 2a 2f 0a  indexing it. */.
10ad0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10ae0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
10af0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3e 3d  e->nQueryLoop >=
10b00 20 28 64 6f 75 62 6c 65 29 31 20 29 3b 0a 20 20   (double)1 );.  
10b10 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
10b20 54 61 62 3b 0a 20 20 6e 54 61 62 6c 65 52 6f 77  Tab;.  nTableRow
10b30 20 3d 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45   = pTable->nRowE
10b40 73 74 3b 0a 20 20 6c 6f 67 4e 20 3d 20 65 73 74  st;.  logN = est
10b50 4c 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29 3b 0a  Log(nTableRow);.
10b60 20 20 63 6f 73 74 54 65 6d 70 49 64 78 20 3d 20    costTempIdx = 
10b70 32 2a 6c 6f 67 4e 2a 28 6e 54 61 62 6c 65 52 6f  2*logN*(nTableRo
10b80 77 2f 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  w/pParse->nQuery
10b90 4c 6f 6f 70 20 2b 20 31 29 3b 0a 20 20 69 66 28  Loop + 1);.  if(
10ba0 20 63 6f 73 74 54 65 6d 70 49 64 78 3e 3d 70 2d   costTempIdx>=p-
10bb0 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20  >cost.rCost ){. 
10bc0 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
10bd0 66 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 74  f creating the t
10be0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 77  ransient table w
10bf0 6f 75 6c 64 20 62 65 20 67 72 65 61 74 65 72 20  ould be greater 
10c00 74 68 61 6e 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  than.    ** doin
10c10 67 20 74 68 65 20 66 75 6c 6c 20 74 61 62 6c 65  g the full table
10c20 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74   scan */.    ret
10c30 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  urn;.  }..  /* S
10c40 65 61 72 63 68 20 66 6f 72 20 61 6e 79 20 65 71  earch for any eq
10c50 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
10c60 6e 20 74 65 72 6d 20 2a 2f 0a 20 20 70 57 43 45  n term */.  pWCE
10c70 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43  nd = &pWC->a[pWC
10c80 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 66 6f 72 28  ->nTerm];.  for(
10c90 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
10ca0 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
10cb0 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
10cc0 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
10cd0 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 70 2d 3e  pTerm, pSrc, p->
10ce0 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
10cf0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
10d00 61 75 74 6f 2d 69 6e 64 65 78 20 72 65 64 75 63  auto-index reduc
10d10 65 73 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e 31  es cost from %.1
10d20 66 20 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20 20  f to %.1f\n",.  
10d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d40 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 2c    p->cost.rCost,
10d50 20 63 6f 73 74 54 65 6d 70 49 64 78 29 29 3b 0a   costTempIdx));.
10d60 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43        p->cost.rC
10d70 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d 70 49 64  ost = costTempId
10d80 78 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  x;.      p->cost
10d90 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67  .plan.nRow = log
10da0 4e 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  N + 1;.      p->
10db0 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
10dc0 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s = WHERE_TEMP_I
10dd0 4e 44 45 58 3b 0a 20 20 20 20 20 20 70 2d 3e 63  NDEX;.      p->c
10de0 6f 73 74 2e 75 73 65 64 20 3d 20 70 54 65 72 6d  ost.used = pTerm
10df0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
10e00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10e10 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
10e20 64 65 66 69 6e 65 20 62 65 73 74 41 75 74 6f 6d  define bestAutom
10e30 61 74 69 63 49 6e 64 65 78 28 41 29 20 20 2f 2a  aticIndex(A)  /*
10e40 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   no-op */.#endif
10e50 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10e60 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
10e70 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
10e80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
10e90 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47  IC_INDEX./*.** G
10ea0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
10eb0 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  construct the In
10ec0 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  dex object for a
10ed0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
10ee0 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20  x.** and to set 
10ef0 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65  up the WhereLeve
10f00 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20  l object pLevel 
10f10 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  so that the code
10f20 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61   generator.** ma
10f30 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61  kes use of the a
10f40 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a  utomatic index..
10f50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10f60 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
10f70 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  cIndex(.  Parse 
10f80 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10f90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
10fa0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
10fb0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
10fc0 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
10fd0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
10fe0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
10ff0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
11000 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
11010 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65  lause term to ge
11020 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  t the next index
11030 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
11040 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
11050 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
11060 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
11070 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
11080 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
11090 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  vel          /* 
110a0 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20  Write new index 
110b0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
110c0 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
110d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
110e0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
110f0 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
11100 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
11110 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
11120 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
11130 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
11140 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
11150 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
11160 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
11170 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
11180 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d    /* Byte of mem
111b0 6f 72 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70  ory needed for p
111c0 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
111d0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
111e0 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64       /* Object d
111f0 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72  escribing the tr
11200 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
11210 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11230 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
11240 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
11250 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
11260 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20   addrInit;      
11270 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
11280 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69  ess of the initi
11290 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73  alization bypass
112a0 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65   jump */.  Table
112b0 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
112c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
112d0 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
112e0 64 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  d */.  KeyInfo *
112f0 70 4b 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyinfo;       
11300 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
11310 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e  ation for the in
11320 64 65 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20  dex */   .  int 
11330 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
11340 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
11350 66 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c  f the index fill
11360 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72   loop */.  int r
11370 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
11380 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
11390 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  er holding an in
113a0 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
113b0 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
113c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
113d0 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f  olumn counter */
113e0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11400 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11410 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c  /.  int mxBitCol
11420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11430 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d  /* Maximum colum
11440 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73  n in pSrc->colUs
11450 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  ed */.  CollSeq 
11460 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
11470 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
11480 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20   sequence to on 
11490 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69  a column */.  Bi
114a0 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
114b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
114c0 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
114d0 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
114e0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
114f0 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
11500 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
11510 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
11520 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  s */..  /* Gener
11530 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70  ate code to skip
11540 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69   over the creati
11550 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  on and initializ
11560 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
11570 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  * transient inde
11580 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62  x on 2nd and sub
11590 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
115a0 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ns of the loop. 
115b0 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
115c0 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
115d0 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72  ( v!=0 );.  addr
115e0 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  Init = sqlite3Co
115f0 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
11600 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
11610 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
11620 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61  s that will be a
11630 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  dded to the inde
11640 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20  x.  ** and used 
11650 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20 63  to match WHERE c
11660 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
11670 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d  s */.  nColumn =
11680 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   0;.  pTable = p
11690 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
116a0 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
116b0 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 69 64 78  C->nTerm];.  idx
116c0 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
116d0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
116e0 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
116f0 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
11700 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
11710 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
11720 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
11730 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
11740 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
11750 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
11760 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
11770 3f 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  ? ((Bitmask)1)<<
11780 28 42 4d 53 2d 31 29 20 3a 20 28 28 42 69 74 6d  (BMS-1) : ((Bitm
11790 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20  ask)1)<<iCol;.  
117a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
117b0 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
117c0 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
117d0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
117e0 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
117f0 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
11800 20 20 20 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20      nColumn++;. 
11810 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c         idxCols |
11820 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  = cMask;.      }
11830 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
11840 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29  ert( nColumn>0 )
11850 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  ;.  pLevel->plan
11860 2e 6e 45 71 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  .nEq = nColumn;.
11870 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
11880 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69  number of additi
11890 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
118a0 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a  ded to create a.
118b0 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e    ** covering in
118c0 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e  dex.  A "coverin
118d0 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69  g index" is an i
118e0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
118f0 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75  ns all.  ** colu
11900 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65 65  mns that are nee
11910 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ded by the query
11920 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72 69  .  With a coveri
11930 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20  ng index, the.  
11940 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
11950 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  e never needs to
11960 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20 41   be accessed.  A
11970 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73  utomatic indices
11980 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20   must.  ** be a 
11990 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62  covering index b
119a0 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65 78  ecause the index
119b0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
119c0 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a  ated if the.  **
119d0 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
119e0 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20  changes and the 
119f0 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
11a00 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75  cannot both be u
11a10 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  sed.  ** if they
11a20 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e   go out of sync.
11a30 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c  .  */.  extraCol
11a40 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  s = pSrc->colUse
11a50 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20  d & (~idxCols | 
11a60 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
11a70 42 4d 53 2d 31 29 29 29 3b 0a 20 20 6d 78 42 69  BMS-1)));.  mxBi
11a80 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e  tCol = (pTable->
11a90 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f  nCol >= BMS-1) ?
11aa0 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d   BMS-1 : pTable-
11ab0 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73  >nCol;.  testcas
11ac0 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
11ad0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74  =BMS-1 );.  test
11ae0 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
11af0 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66  ol==BMS-2 );.  f
11b00 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
11b10 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
11b20 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 28 28  ( extraCols & ((
11b30 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20  (Bitmask)1)<<i) 
11b40 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d  ) nColumn++;.  }
11b50 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
11b60 55 73 65 64 20 26 20 28 28 28 42 69 74 6d 61 73  Used & (((Bitmas
11b70 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29  k)1)<<(BMS-1)) )
11b80 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d  {.    nColumn +=
11b90 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20   pTable->nCol - 
11ba0 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70  BMS + 1;.  }.  p
11bb0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
11bc0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
11bd0 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49  UMN_EQ | WHERE_I
11be0 44 58 5f 4f 4e 4c 59 20 7c 20 57 4f 5f 45 51 3b  DX_ONLY | WO_EQ;
11bf0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
11c00 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
11c10 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
11c20 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 6e 42  is index */.  nB
11c30 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64  yte = sizeof(Ind
11c40 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b 3d 20  ex);.  nByte += 
11c50 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 69  nColumn*sizeof(i
11c60 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65  nt);     /* Inde
11c70 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  x.aiColumn */.  
11c80 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
11c90 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 20  *sizeof(char*); 
11ca0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
11cb0 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20  l */.  nByte += 
11cc0 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  nColumn;        
11cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11ce0 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a  x.aSortOrder */.
11cf0 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
11d00 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
11d10 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  rse->db, nByte);
11d20 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
11d30 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 65 76 65   return;.  pLeve
11d40 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d  l->plan.u.pIdx =
11d50 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 61   pIdx;.  pIdx->a
11d60 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zColl = (char**)
11d70 26 70 49 64 78 5b 31 5d 3b 0a 20 20 70 49 64 78  &pIdx[1];.  pIdx
11d80 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
11d90 74 2a 29 26 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  t*)&pIdx->azColl
11da0 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64  [nColumn];.  pId
11db0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
11dc0 28 75 38 2a 29 26 70 49 64 78 2d 3e 61 69 43 6f  (u8*)&pIdx->aiCo
11dd0 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  lumn[nColumn];. 
11de0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22   pIdx->zName = "
11df0 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70  auto-index";.  p
11e00 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e  Idx->nColumn = n
11e10 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e  Column;.  pIdx->
11e20 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
11e30 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
11e40 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
11e50 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
11e60 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
11e70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
11e80 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
11e90 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
11ea0 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
11eb0 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
11ec0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
11ed0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
11ee0 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
11ef0 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28   ((Bitmask)1)<<(
11f00 42 4d 53 2d 31 29 20 3a 20 28 28 42 69 74 6d 61  BMS-1) : ((Bitma
11f10 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20  sk)1)<<iCol;.   
11f20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
11f30 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
11f40 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
11f50 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
11f60 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
11f70 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
11f80 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
11f90 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
11fa0 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
11fb0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
11fc0 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
11fd0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
11fe0 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
11ff0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
12000 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
12010 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f   ALWAYS(pColl) ?
12020 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
12030 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
12040 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
12050 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
12060 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 65 76 65  t( (u32)n==pLeve
12070 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 29 3b 0a 0a  l->plan.nEq );..
12080 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f    /* Add additio
12090 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  nal columns need
120a0 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61  ed to make the a
120b0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
120c0 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72  nto.  ** a cover
120d0 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66  ing index */.  f
120e0 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
120f0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
12100 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 28 28  ( extraCols & ((
12110 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20  (Bitmask)1)<<i) 
12120 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
12130 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
12140 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
12150 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
12160 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
12170 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
12180 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28  c->colUsed & (((
12190 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
121a0 2d 31 29 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  -1)) ){.    for(
121b0 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c  i=BMS-1; i<pTabl
121c0 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
121d0 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
121e0 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
121f0 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
12200 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
12210 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
12220 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d   }.  assert( n==
12230 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a  nColumn );..  /*
12240 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f   Create the auto
12250 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  matic index */. 
12260 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69   pKeyinfo = sqli
12270 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
12280 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
12290 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
122a0 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20  >iIdxCur>=0 );. 
122b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
122c0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74  p4(v, OP_OpenAut
122d0 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e  oindex, pLevel->
122e0 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e  iIdxCur, nColumn
122f0 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +1, 0,.         
12300 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
12310 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyinfo, P4_K
12320 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
12330 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
12340 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
12350 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
12360 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
12370 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
12380 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61  h content */.  a
12390 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
123a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
123b0 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d  _Rewind, pLevel-
123c0 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72 65 67  >iTabCur);.  reg
123d0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
123e0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
123f0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  e);.  sqlite3Gen
12400 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
12410 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76  arse, pIdx, pLev
12420 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67  el->iTabCur, reg
12430 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71  Record, 1);.  sq
12440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12450 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
12460 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
12470 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
12480 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12490 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
124a0 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
124b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
124c0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c  2(v, OP_Next, pL
124d0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61  evel->iTabCur, a
124e0 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c  ddrTop+1);.  sql
124f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
12500 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  (v, SQLITE_STMTS
12510 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29  TATUS_AUTOINDEX)
12520 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
12530 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
12540 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  op);.  sqlite3Re
12550 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
12560 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
12570 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  .  .  /* Jump he
12580 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67  re when skipping
12590 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
125a0 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
125b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
125c0 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e  addrInit);.}.#en
125d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
125e0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
125f0 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EX */..#ifndef S
12600 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12610 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c  ALTABLE./*.** Al
12620 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  locate and popul
12630 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69  ate an sqlite3_i
12640 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
12650 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ure. It is the .
12660 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
12670 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
12680 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65  to eventually re
12690 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63 74  lease the struct
126a0 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e  ure.** by passin
126b0 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65  g the pointer re
126c0 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
126d0 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74  unction to sqlit
126e0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
126f0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64  atic sqlite3_ind
12700 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74  ex_info *allocat
12710 65 49 6e 64 65 78 49 6e 66 6f 28 57 68 65 72 65  eIndexInfo(Where
12720 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20 20 50  BestIdx *p){.  P
12730 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
12740 2d 3e 70 50 61 72 73 65 3b 20 0a 20 20 57 68 65  ->pParse; .  Whe
12750 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20  reClause *pWC = 
12760 70 2d 3e 70 57 43 3b 0a 20 20 73 74 72 75 63 74  p->pWC;.  struct
12770 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
12780 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
12790 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
127a0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
127b0 79 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  y;.  int i, j;. 
127c0 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
127d0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
127e0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
127f0 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
12800 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
12810 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
12820 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
12830 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
12840 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
12850 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
12860 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
12870 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
12880 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12890 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48  *pIdxInfo;..  WH
128a0 45 52 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d  ERETRACE(("Recom
128b0 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66  puting index inf
128c0 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20  o for %s...\n", 
128d0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
128e0 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  e));..  /* Count
128f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
12900 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c  ossible WHERE cl
12910 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
12920 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20   referring.  ** 
12930 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
12940 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
12950 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d  =nTerm=0, pTerm=
12960 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
12970 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
12980 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
12990 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
129a0 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
129b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
129c0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
129d0 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d  eOperator&(pTerm
129e0 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d  ->eOperator-1))=
129f0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
12a00 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
12a10 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20  ator==WO_IN );. 
12a20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
12a30 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
12a40 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
12a50 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
12a60 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
12a70 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
12a80 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
12a90 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
12aa0 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
12ab0 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  nue;.    nTerm++
12ac0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
12ad0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
12ae0 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
12af0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
12b00 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
12b10 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
12b20 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
12b30 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
12b40 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
12b50 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
12b60 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
12b70 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
12b80 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
12b90 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
12ba0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
12bb0 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
12bc0 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
12bd0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
12be0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
12bf0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
12c00 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
12c10 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
12c20 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
12c30 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
12c40 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e    }.    if( i==n
12c50 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
12c60 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = n;.    }.  }
12c70 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
12c80 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
12c90 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
12ca0 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
12cb0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
12cc0 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
12cd0 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49  b, sizeof(*pIdxI
12ce0 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20  nfo).           
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d00 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
12d10 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
12d20 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
12d50 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
12d60 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66  nOrderBy );.  if
12d70 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
12d80 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12d90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
12da0 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
12db0 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20     /* (double)0 
12dc0 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54  In case of SQLIT
12dd0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
12de0 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20  POINT... */.    
12df0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
12e00 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
12e10 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
12e20 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
12e30 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
12e40 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61  contains.  ** ma
12e50 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ny fields that a
12e60 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e  re declared "con
12e70 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78  st" to prevent x
12e80 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20  BestIndex from. 
12e90 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65   ** changing the
12ea0 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  m.  We have to d
12eb0 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73  o some funky cas
12ec0 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f  ting in order to
12ed0 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
12ee0 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20   those fields.. 
12ef0 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
12f00 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
12f10 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
12f20 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b  t*)&pIdxInfo[1];
12f30 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d  .  pIdxOrderBy =
12f40 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
12f50 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
12f60 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
12f70 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74  ;.  pUsage = (st
12f80 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
12f90 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
12fa0 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
12fb0 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a  y[nOrderBy];.  *
12fc0 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
12fd0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
12fe0 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  Term;.  *(int*)&
12ff0 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
13000 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
13010 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
13020 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
13030 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
13040 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
13050 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75  dxCons;.  *(stru
13060 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13070 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
13080 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
13090 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
130a0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
130b0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
130c0 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
130d0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
130e0 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13120 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
13130 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c  e;..  for(i=j=0,
13140 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
13150 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
13160 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
13170 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
13180 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
13190 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
131a0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
131b0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
131c0 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  &(pTerm->eOperat
131d0 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20  or-1))==0 );.   
131e0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
131f0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
13200 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
13210 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
13220 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator==WO_ISNULL 
13230 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
13240 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
13250 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
13260 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13270 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
13280 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
13290 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
132a0 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
132b0 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
132c0 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
132d0 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
132e0 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
132f0 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
13300 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
13310 72 61 74 6f 72 3b 0a 20 20 20 20 2f 2a 20 54 68  rator;.    /* Th
13320 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
13330 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
13340 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
13350 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
13360 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f  e.    ** the WO_
13370 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
13380 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
13390 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
133a0 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66  l.  The.    ** f
133b0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
133c0 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
133d0 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
133e0 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f  ( WO_EQ==SQLITE_
133f0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
13400 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
13410 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
13420 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
13430 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LT );.    asse
13440 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
13450 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
13460 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_LE );.    ass
13470 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
13480 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
13490 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73  INT_GT );.    as
134a0 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c  sert( WO_GE==SQL
134b0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
134c0 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61  AINT_GE );.    a
134d0 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d  ssert( WO_MATCH=
134e0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
134f0 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29  NSTRAINT_MATCH )
13500 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
13510 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
13520 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f   (WO_EQ|WO_LT|WO
13530 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
13540 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20  WO_MATCH) );.   
13550 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
13560 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
13570 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
13580 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
13590 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
135a0 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
135b0 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
135c0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
135d0 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
135e0 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
135f0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
13600 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
13610 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dxInfo;.}../*.**
13620 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   The table objec
13630 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73  t reference pass
13640 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
13650 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
13660 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
13670 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76  st represent a v
13680 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68  irtual table. Th
13690 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
136a0 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  kes the xBestInd
136b0 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ex().** method o
136c0 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
136d0 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c  ble with the sql
136e0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
136f0 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 0a 2a  pointer passed.*
13700 2a 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  * as the argumen
13710 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
13720 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
13730 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
13740 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
13750 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
13760 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
13770 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
13780 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
13790 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
137a0 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
137b0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
137c0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
137d0 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
137e0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
137f0 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
13800 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
13810 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
13820 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
13830 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
13840 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
13850 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
13860 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
13870 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
13880 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
13890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
138a0 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
138b0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
138c0 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
138d0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
138e0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
138f0 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
13900 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
13910 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
13920 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
13930 74 20 72 63 3b 0a 0a 20 20 57 48 45 52 45 54 52  t rc;..  WHERETR
13940 41 43 45 28 28 22 78 42 65 73 74 49 6e 64 65 78  ACE(("xBestIndex
13950 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62   for %s\n", pTab
13960 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41  ->zName));.  TRA
13970 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
13980 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
13990 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
139a0 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
139b0 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
139c0 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
139d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
139e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
139f0 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
13a00 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
13a10 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
13a20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56     }else if( !pV
13a30 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
13a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13a50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
13a60 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
13a70 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  r(rc));.    }els
13a80 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
13a90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13aa0 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45   "%s", pVtab->zE
13ab0 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
13ac0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
13ad0 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
13ae0 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
13af0 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  sg = 0;..  for(i
13b00 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
13b10 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
13b20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61  if( !p->aConstra
13b30 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
13b40 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
13b50 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
13b60 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
13b70 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13b80 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
13b90 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
13ba0 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
13bb0 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
13bc0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13bd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
13be0 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  rn pParse->nErr;
13bf0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
13c00 74 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  te the best inde
13c10 78 20 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20  x for a virtual 
13c20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
13c30 20 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 63   best index is c
13c40 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 78  omputed by the x
13c50 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
13c60 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a   of the virtual.
13c70 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e  ** table module.
13c80 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
13c90 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
13ca0 77 72 61 70 70 65 72 20 74 68 61 74 20 73 65 74  wrapper that set
13cb0 73 20 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s up.** the sqli
13cc0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13cd0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
13ce0 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69   used to communi
13cf0 63 61 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65  cate with.** xBe
13d00 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  stIndex..**.** I
13d10 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72  n a join, this r
13d20 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20  outine might be 
13d30 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20  called multiple 
13d40 74 69 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a  times for the.**
13d50 20 73 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61   same virtual ta
13d60 62 6c 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ble.  The sqlite
13d70 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
13d80 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
13d90 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  d.** and initial
13da0 69 7a 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73  ized on the firs
13db0 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
13dc0 20 72 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73   reused on all s
13dd0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76  ubsequent.** inv
13de0 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73  ocations.  The s
13df0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13e00 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
13e10 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a  lso used when.**
13e20 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
13e30 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
13e40 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
13e50 20 54 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65   The whereInfoDe
13e60 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69  lete() .** routi
13e70 6e 65 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ne takes care of
13e80 20 66 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c   freeing the sql
13e90 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13ea0 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72 0a  structure after.
13eb0 2a 2a 20 65 76 65 72 79 62 6f 64 79 20 68 61 73  ** everybody has
13ec0 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 69   finished with i
13ed0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
13ee0 64 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64  d bestVirtualInd
13ef0 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20  ex(WhereBestIdx 
13f00 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
13f10 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
13f20 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ;      /* The pa
13f30 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13f40 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
13f50 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20 20  pWC = p->pWC;   
13f60 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
13f70 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
13f80 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
13f90 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
13fa0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
13fb0 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
13fc0 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ch */.  Table *p
13fd0 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
13fe0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
13ff0 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
14000 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
14010 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14020 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
14030 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
14040 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
14050 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
14060 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
14070 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
14080 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
14090 20 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 0a    double rCost;.
140a0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
140b0 77 73 46 6c 61 67 73 20 69 73 20 69 6e 69 74 69  wsFlags is initi
140c0 61 6c 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20 73  alized to some s
140d0 61 6e 65 20 76 61 6c 75 65 2e 20 4f 74 68 65 72  ane value. Other
140e0 77 69 73 65 2c 20 69 66 20 74 68 65 20 0a 20 20  wise, if the .  
140f0 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c  ** malloc in all
14100 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29  ocateIndexInfo()
14110 20 66 61 69 6c 73 20 61 6e 64 20 74 68 69 73 20   fails and this 
14120 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
14130 20 6c 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77 73   leaving.  ** ws
14140 46 6c 61 67 73 20 69 6e 20 61 6e 20 75 6e 69 6e  Flags in an unin
14150 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2c  itialized state,
14160 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 20   the caller may 
14170 62 65 68 61 76 65 20 75 6e 70 72 65 64 69 63 74  behave unpredict
14180 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ably..  */.  mem
14190 73 65 74 28 26 70 2d 3e 63 6f 73 74 2c 20 30 2c  set(&p->cost, 0,
141a0 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 73 74 29   sizeof(p->cost)
141b0 29 3b 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61  );.  p->cost.pla
141c0 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  n.wsFlags = WHER
141d0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
141e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c  .  /* If the sql
141f0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14200 73 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f  structure has no
14210 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  t been previousl
14220 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
14230 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
14240 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  , then allocate 
14250 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
14260 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 49  t now..  */.  pI
14270 64 78 49 6e 66 6f 20 3d 20 2a 70 2d 3e 70 70 49  dxInfo = *p->ppI
14280 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49  dxInfo;.  if( pI
14290 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
142a0 20 2a 70 2d 3e 70 70 49 64 78 49 6e 66 6f 20 3d   *p->ppIdxInfo =
142b0 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f   pIdxInfo = allo
142c0 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 29  cateIndexInfo(p)
142d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
142e0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Info==0 ){.    r
142f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
14300 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
14310 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
14320 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14330 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20 70   that pIdxInfo p
14340 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69  oints.  ** to wi
14350 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69  ll have been ini
14360 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65 72  tialized, either
14370 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
14380 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ent invocation o
14390 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f  r.  ** during so
143a0 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74  me prior invocat
143b0 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73  ion.  Now we jus
143c0 74 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f 6d  t have to custom
143d0 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65 74  ize the.  ** det
143e0 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66 6f  ails of pIdxInfo
143f0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
14400 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20   invocation and 
14410 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20  pass it to.  ** 
14420 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f  xBestIndex..  */
14430 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c  ..  /* The modul
14440 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 64  e name must be d
14450 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79  efined. Also, by
14460 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
14470 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  e must.  ** be a
14480 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
14490 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
144a0 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65  cture. Otherwise
144b0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69 65  .  ** sqlite3Vie
144c0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
144d0 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69 63  ) would have pic
144e0 6b 65 64 20 75 70 20 74 68 65 20 65 72 72 6f 72  ked up the error
144f0 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  . .  */.  assert
14500 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  ( pTab->azModule
14510 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d  Arg && pTab->azM
14520 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20  oduleArg[0] );. 
14530 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14540 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65  GetVTable(pParse
14550 2d 3e 64 62 2c 20 70 54 61 62 29 20 29 3b 0a 0a  ->db, pTab) );..
14560 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f    /* Set the aCo
14570 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
14580 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69  e fields and ini
14590 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a  tialize all .  *
145a0 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
145b0 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  es to zero..  **
145c0 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e  .  ** aConstrain
145d0 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72  t[].usable is tr
145e0 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ue for constrain
145f0 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67  ts where the rig
14600 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64  ht-hand.  ** sid
14610 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
14620 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
14630 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
14640 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a   of the current.
14650 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20    ** table.  In 
14660 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
14670 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
14680 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
14690 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
146a0 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72     column = expr
146b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77  .  **.  ** and w
146c0 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
146d0 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
146e0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e constraint on 
146f0 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20  column is .  ** 
14700 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c  only valid if al
14710 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  l tables referen
14720 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75  ced in expr occu
14730 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  r to the left.  
14740 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
14750 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
14760 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
14770 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20   aConstraints[] 
14780 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65  array contains e
14790 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
147a0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
147b0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
147c0 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20  able.  That way 
147d0 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20  we only have to 
147e0 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a  compute it once.
147f0 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
14800 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f   we might try to
14810 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69   pick the best i
14820 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69  ndex multiple ti
14830 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61  mes..  ** For ea
14840 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69  ch attempt at pi
14850 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  cking an index, 
14860 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62  the order of tab
14870 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
14880 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69  join might be di
14890 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61  fferent so we ha
148a0 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ve to recompute 
148b0 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a  the usable flag.
148c0 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a    ** each time..
148d0 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
148e0 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
148f0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14900 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
14910 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
14920 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
14930 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
14940 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  age;.  for(i=0; 
14950 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
14960 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
14970 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a  dxCons++){.    j
14980 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
14990 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54  rmOffset;.    pT
149a0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
149b0 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
149c0 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
149d0 3e 70 72 65 72 65 71 52 69 67 68 74 26 70 2d 3e  >prereqRight&p->
149e0 6e 6f 74 52 65 61 64 79 29 20 3f 20 30 20 3a 20  notReady) ? 0 : 
149f0 31 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  1;.  }.  memset(
14a00 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
14a10 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
14a20 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
14a30 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nt);.  if( pIdxI
14a40 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
14a50 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  dxStr ){.    sql
14a60 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
14a70 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d  fo->idxStr);.  }
14a80 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
14a90 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
14aa0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
14ab0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  .  pIdxInfo->nee
14ac0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
14ad0 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  0;.  pIdxInfo->o
14ae0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
14af0 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f 75 62 6c   0;.  /* ((doubl
14b00 65 29 32 29 20 49 6e 20 63 61 73 65 20 6f 66 20  e)2) In case of 
14b10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
14b20 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
14b30 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
14b40 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
14b50 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28  ITE_BIG_DBL / ((
14b60 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20 6e 4f 72  double)2);.  nOr
14b70 64 65 72 42 79 20 3d 20 70 49 64 78 49 6e 66 6f  derBy = pIdxInfo
14b80 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  ->nOrderBy;.  if
14b90 28 20 21 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  ( !p->pOrderBy )
14ba0 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
14bb0 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
14bc0 7d 0a 0a 20 20 69 66 28 20 76 74 61 62 42 65 73  }..  if( vtabBes
14bd0 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
14be0 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 20 29  Tab, pIdxInfo) )
14bf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
14c00 7d 0a 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  }..  pIdxCons = 
14c10 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
14c20 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
14c30 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
14c40 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
14c50 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
14c60 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
14c70 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 55  i++){.    if( pU
14c80 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
14c90 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  x>0 ){.      p->
14ca0 63 6f 73 74 2e 75 73 65 64 20 7c 3d 20 70 57 43  cost.used |= pWC
14cb0 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 5b 69 5d 2e  ->a[pIdxCons[i].
14cc0 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65  iTermOffset].pre
14cd0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a  reqRight;.    }.
14ce0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
14cf0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
14d00 59 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68  Y clause, and th
14d10 65 20 73 65 6c 65 63 74 65 64 20 76 69 72 74 75  e selected virtu
14d20 61 6c 20 74 61 62 6c 65 20 69 6e 64 65 78 0a 20  al table index. 
14d30 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 61 74   ** does not sat
14d40 69 73 66 79 20 69 74 2c 20 69 6e 63 72 65 61 73  isfy it, increas
14d50 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  e the cost of th
14d60 65 20 73 63 61 6e 20 61 63 63 6f 72 64 69 6e 67  e scan according
14d70 6c 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61  ly. This.  ** ma
14d80 74 63 68 65 73 20 74 68 65 20 70 72 6f 63 65 73  tches the proces
14d90 73 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76 69 72  sing for non-vir
14da0 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 62  tual tables in b
14db0 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 2e  estBtreeIndex().
14dc0 0a 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20 3d 20  .  */.  rCost = 
14dd0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
14de0 74 65 64 43 6f 73 74 3b 0a 20 20 69 66 28 20 70  tedCost;.  if( p
14df0 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 49  ->pOrderBy && pI
14e00 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
14e10 6f 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20 20  onsumed==0 ){.  
14e20 20 20 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f    rCost += estLo
14e30 67 28 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b 0a  g(rCost)*rCost;.
14e40 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
14e50 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  st is not allowe
14e60 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74  d to be larger t
14e70 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  han SQLITE_BIG_D
14e80 42 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69  BL (the.  ** ini
14e90 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77  tal value of low
14ea0 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20  estCost in this 
14eb0 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20  loop. If it is, 
14ec0 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63  then the.  ** (c
14ed0 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20  ost<lowestCost) 
14ee0 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20  test below will 
14ef0 6e 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20  never be true.. 
14f00 20 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28   ** .  ** Use "(
14f10 64 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61  double)2" instea
14f20 64 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61  d of "2.0" in ca
14f30 73 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  se OMIT_FLOATING
14f40 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20  _POINT .  ** is 
14f50 64 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  defined..  */.  
14f60 69 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f  if( (SQLITE_BIG_
14f70 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29  DBL/((double)2))
14f80 3c 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 70 2d  <rCost ){.    p-
14f90 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 28 53  >cost.rCost = (S
14fa0 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28  QLITE_BIG_DBL/((
14fb0 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65  double)2));.  }e
14fc0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74  lse{.    p->cost
14fd0 2e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a  .rCost = rCost;.
14fe0 20 20 7d 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c    }.  p->cost.pl
14ff0 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20  an.u.pVtabIdx = 
15000 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pIdxInfo;.  if( 
15010 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
15020 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20  yConsumed ){.   
15030 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
15040 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
15050 52 44 45 52 45 44 3b 0a 20 20 20 20 70 2d 3e 63  RDERED;.    p->c
15060 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20  ost.plan.nOBSat 
15070 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65  = nOrderBy;.  }e
15080 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74  lse{.    p->cost
15090 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 70  .plan.nOBSat = p
150a0 2d 3e 69 20 3f 20 70 2d 3e 61 4c 65 76 65 6c 5b  ->i ? p->aLevel[
150b0 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f 42  p->i-1].plan.nOB
150c0 53 61 74 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 70  Sat : 0;.  }.  p
150d0 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 45 71 20  ->cost.plan.nEq 
150e0 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
150f0 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
15100 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  erBy;..  /* Try 
15110 74 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65 20 65  to find a more e
15120 66 66 69 63 69 65 6e 74 20 61 63 63 65 73 73 20  fficient access 
15130 70 61 74 74 65 72 6e 20 62 79 20 75 73 69 6e 67  pattern by using
15140 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65 78 65   multiple indexe
15150 73 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69  s.  ** to optimi
15160 7a 65 20 61 6e 20 4f 52 20 65 78 70 72 65 73 73  ze an OR express
15170 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 57  ion within the W
15180 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 20 20  HERE clause. .  
15190 2a 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73  */.  bestOrClaus
151a0 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 23 65 6e  eIndex(p);.}.#en
151b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
151c0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
151d0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
151e0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f  E_ENABLE_STAT3./
151f0 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
15200 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  e location of a 
15210 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61  particular key a
15220 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e  mong all keys in
15230 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53   an.** index.  S
15240 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
15250 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c   in aStat as fol
15260 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  lows:.**.**    a
15270 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74  Stat[0]      Est
15280 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
15290 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a   less than pVal.
152a0 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20  **    aStat[1]  
152b0 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
152c0 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f  of rows equal to
152d0 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75   pVal.**.** Retu
152e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
152f0 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
15300 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53  ic int whereKeyS
15310 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  tats(.  Parse *p
15320 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
15330 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
15340 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
15350 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
15360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15370 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72  ndex to consider
15380 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20   domain of */.  
15390 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
153a0 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Val,        /* V
153b0 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72  alue to consider
153c0 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55   */.  int roundU
153d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
153e0 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66    /* Round up if
153f0 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f   true.  Round do
15400 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20  wn if false */. 
15410 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20   tRowcnt *aStat 
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15430 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74  OUT: stats writt
15440 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  en here */.){.  
15450 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64  tRowcnt n;.  Ind
15460 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
15470 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79 70  e;.  int i, eTyp
15480 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20  e;.  int isEq = 
15490 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64 6f  0;.  i64 v;.  do
154a0 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61  uble r, rS;..  a
154b0 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d  ssert( roundUp==
154c0 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20  0 || roundUp==1 
154d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
154e0 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
154f0 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20    if( pVal==0 ) 
15500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15510 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d  ROR;.  n = pIdx-
15520 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
15530 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  aSample = pIdx->
15540 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65  aSample;.  eType
15550 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
15560 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20  _type(pVal);..  
15570 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
15580 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  E_INTEGER ){.   
15590 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
155a0 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a  ue_int64(pVal);.
155b0 20 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b 0a      r = (i64)v;.
155c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
155d0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  Idx->nSample; i+
155e0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
155f0 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
15600 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f  SQLITE_NULL ) co
15610 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
15620 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
15630 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe>=SQLITE_TEXT 
15640 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
15650 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
15660 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
15670 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69  GER ){.        i
15680 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  f( aSample[i].u.
15690 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=v ){.        
156a0 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65    isEq = aSample
156b0 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20  [i].u.i==v;.    
156c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
156d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
156e0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
156f0 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  rt( aSample[i].e
15700 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
15710 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AT );.        if
15720 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72  ( aSample[i].u.r
15730 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=r ){.         
15740 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b   isEq = aSample[
15750 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20  i].u.r==r;.     
15760 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15780 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
15790 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
157a0 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20 73  OAT ){.    r = s
157b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
157c0 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 66  ble(pVal);.    f
157d0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
157e0 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  nSample; i++){. 
157f0 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
15800 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
15810 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  E_NULL ) continu
15820 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  e;.      if( aSa
15830 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53  mple[i].eType>=S
15840 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65  QLITE_TEXT ) bre
15850 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ak;.      if( aS
15860 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
15870 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
15880 20 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61          rS = aSa
15890 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20  mple[i].u.r;.   
158a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
158b0 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69    rS = aSample[i
158c0 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20  ].u.i;.      }. 
158d0 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20 29       if( rS>=r )
158e0 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d  {.        isEq =
158f0 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20   rS==r;.        
15900 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
15910 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
15920 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e   eType==SQLITE_N
15930 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 30  ULL ){.    i = 0
15940 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c  ;.    if( aSampl
15950 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[0].eType==SQLI
15960 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d  TE_NULL ) isEq =
15970 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
15980 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
15990 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65  SQLITE_TEXT || e
159a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
159b0 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  B );.    for(i=0
159c0 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ; i<pIdx->nSampl
159d0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
159e0 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
159f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
15a00 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65   || aSample[i].e
15a10 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
15a20 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  B ){.        bre
15a30 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15a40 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78  }.    if( i<pIdx
15a50 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20 20  ->nSample ){    
15a60 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33    .      sqlite3
15a70 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
15a80 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  b;.      CollSeq
15a90 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63   *pColl;.      c
15aa0 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20  onst u8 *z;.    
15ab0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
15ac0 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
15ad0 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75      z = (const u
15ae0 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  8 *)sqlite3_valu
15af0 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20  e_blob(pVal);.  
15b00 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
15b10 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
15b20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
15b30 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  ll->enc==SQLITE_
15b40 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65  UTF8 );.      }e
15b50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
15b60 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
15b70 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 53  ollSeq(pParse, S
15b80 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a  QLITE_UTF8, 0, *
15b90 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20  pIdx->azColl);. 
15ba0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
15bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
15bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15bd0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
15be0 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e          z = (con
15bf0 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 56  st u8 *)sqlite3V
15c00 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 70  alueText(pVal, p
15c10 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
15c20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20      if( !z ){.  
15c30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15c40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
15c60 73 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f 6c  ssert( z && pCol
15c70 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l && pColl->xCmp
15c80 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
15c90 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c    n = sqlite3Val
15ca0 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70 43  ueBytes(pVal, pC
15cb0 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a 20 20  oll->enc);.  .  
15cc0 20 20 20 20 66 6f 72 28 3b 20 69 3c 70 49 64 78      for(; i<pIdx
15cd0 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
15ce0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
15cf0 20 20 20 20 20 20 20 20 69 6e 74 20 65 53 61 6d          int eSam
15d00 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d 70 6c  pletype = aSampl
15d10 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20  e[i].eType;.    
15d20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74      if( eSamplet
15d30 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f 6e 74  ype<eType ) cont
15d40 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
15d50 28 20 65 53 61 6d 70 6c 65 74 79 70 65 21 3d 65  ( eSampletype!=e
15d60 54 79 70 65 20 29 20 62 72 65 61 6b 3b 0a 23 69  Type ) break;.#i
15d70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15d80 54 5f 55 54 46 31 36 0a 20 20 20 20 20 20 20 20  T_UTF16.        
15d90 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d  if( pColl->enc!=
15da0 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
15db0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 61           int nSa
15dc0 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  mple;.          
15dd0 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20  char *zSample = 
15de0 73 71 6c 69 74 65 33 55 74 66 38 74 6f 31 36 28  sqlite3Utf8to16(
15df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
15e00 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61  b, pColl->enc, a
15e10 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61  Sample[i].u.z, a
15e20 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c  Sample[i].nByte,
15e30 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 20   &nSample.      
15e40 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
15e50 20 69 66 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b   if( !zSample ){
15e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
15e70 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
15e80 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
15e90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15ea0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
15eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15ec0 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  c = pColl->xCmp(
15ed0 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53  pColl->pUser, nS
15ee0 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20  ample, zSample, 
15ef0 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  n, z);.         
15f00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15f10 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20  b, zSample);.   
15f20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
15f30 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
15f40 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d        c = pColl-
15f50 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
15f60 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  er, aSample[i].n
15f70 42 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  Byte, aSample[i]
15f80 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20  .u.z, n, z);.   
15f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
15fa0 66 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( c>=0 ){.     
15fb0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
15fc0 69 73 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  isEq = 1;.      
15fd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15fe0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15ff0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20   }.  }..  /* At 
16000 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d  this point, aSam
16010 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69  ple[i] is the fi
16020 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 20  rst sample that 
16030 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  is greater than.
16040 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f    ** or equal to
16050 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d   pVal.  Or if i=
16060 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20  =pIdx->nSample, 
16070 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  then all samples
16080 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74   are less.  ** t
16090 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61 53  han pVal.  If aS
160a0 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20  ample[i]==pVal, 
160b0 74 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a 20 20  then isEq==1..  
160c0 2a 2f 0a 20 20 69 66 28 20 69 73 45 71 20 29 7b  */.  if( isEq ){
160d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70  .    assert( i<p
160e0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a  Idx->nSample );.
160f0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61      aStat[0] = a
16100 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20  Sample[i].nLt;. 
16110 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53     aStat[1] = aS
16120 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a 20 20  ample[i].nEq;.  
16130 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63  }else{.    tRowc
16140 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65  nt iLower, iUppe
16150 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28  r, iGap;.    if(
16160 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69   i==0 ){.      i
16170 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
16180 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
16190 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 65  e[0].nLt;.    }e
161a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65  lse{.      iUppe
161b0 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61  r = i>=pIdx->nSa
161c0 6d 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61 6d 70  mple ? n : aSamp
161d0 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 20  le[i].nLt;.     
161e0 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
161f0 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61 53 61  e[i-1].nEq + aSa
16200 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a 20  mple[i-1].nLt;. 
16210 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31     }.    aStat[1
16220 5d 20 3d 20 70 49 64 78 2d 3e 61 76 67 45 71 3b  ] = pIdx->avgEq;
16230 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
16240 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
16250 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
16260 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
16270 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
16280 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
16290 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
162a0 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
162b0 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
162c0 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
162d0 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
162e0 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
162f0 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20  r + iGap;.  }.  
16300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16310 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
16320 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
16330 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65  3 */../*.** If e
16340 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
16350 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74  represents a lit
16360 65 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20  eral value, set 
16370 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  *pp to point to.
16380 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  ** an sqlite3_va
16390 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
163a0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d  ntaining the sam
163b0 65 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66  e value, with af
163c0 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70  finity.** aff ap
163d0 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66  plied to it, bef
163e0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49  ore returning. I
163f0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
16400 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a  ibility of the .
16410 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
16420 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
16430 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
16440 79 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20  y passing it to 
16450 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65  .** sqlite3Value
16460 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Free()..**.** If
16470 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72   the current par
16480 73 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c  se is a recompil
16490 65 20 28 73 71 6c 69 74 65 33 52 65 70 72 65 70  e (sqlite3Reprep
164a0 61 72 65 28 29 29 20 61 6e 64 20 70 45 78 70 72  are()) and pExpr
164b0 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61  .** is an SQL va
164c0 72 69 61 62 6c 65 20 74 68 61 74 20 63 75 72 72  riable that curr
164d0 65 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d  ently has a non-
164e0 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64  NULL value bound
164f0 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74   to it,.** creat
16500 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  e an sqlite3_val
16510 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
16520 74 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c  taining this val
16530 75 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a  ue, again with.*
16540 2a 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 61  * affinity aff a
16550 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e  pplied to it, in
16560 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
16570 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 61  neither of the a
16580 62 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20  bove apply, set 
16590 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  *pp to NULL..**.
165a0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
165b0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
165c0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
165d0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
165e0 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  K..*/.#ifdef SQL
165f0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
16600 0a 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75  .static int valu
16610 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72  eFromExpr(.  Par
16620 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
16630 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75  xpr *pExpr, .  u
16640 38 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65  8 aff, .  sqlite
16650 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a  3_value **pp.){.
16660 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
16670 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20 20  =TK_VARIABLE.   
16680 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  || (pExpr->op==T
16690 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45  K_REGISTER && pE
166a0 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52  xpr->op2==TK_VAR
166b0 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20  IABLE).  ){.    
166c0 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70 72  int iVar = pExpr
166d0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73  ->iColumn;.    s
166e0 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
166f0 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64  mask(pParse->pVd
16700 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 2a  be, iVar);.    *
16710 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pp = sqlite3Vdbe
16720 47 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2d  GetValue(pParse-
16730 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61  >pReprepare, iVa
16740 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65 74  r, aff);.    ret
16750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16760 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
16770 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  te3ValueFromExpr
16780 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
16790 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  pr, SQLITE_UTF8,
167a0 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e   aff, pp);.}.#en
167b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
167c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
167d0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
167e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
167f0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73  that will be vis
16800 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e  ited.** by scann
16810 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ing an index for
16820 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75   a range of valu
16830 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61  es. The range ma
16840 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a  y have an upper.
16850 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65  ** bound, a lowe
16860 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68  r bound, or both
16870 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  . The WHERE clau
16880 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65  se terms that se
16890 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61  t the upper.** a
168a0 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20  nd lower bounds 
168b0 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20  are represented 
168c0 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  by pLower and pU
168d0 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
168e0 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  y. For.** exampl
168f0 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
16900 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
16910 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  1(a):.**.**   ..
16920 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
16930 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
16940 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
16950 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f            |_____
16960 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20  |   |_____|.**  
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16990 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
169a0 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20          pLower  
169b0 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49    pUpper.**.** I
169c0 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
169d0 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62  upper or lower b
169e0 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73  ound is not pres
169f0 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69  ent, then NULL i
16a00 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70  s passed in.** p
16a10 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72  lace of the corr
16a20 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54  esponding WhereT
16a30 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  erm..**.** The n
16a40 45 71 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  Eq parameter is 
16a50 70 61 73 73 65 64 20 74 68 65 20 69 6e 64 65 78  passed the index
16a60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   of the index co
16a70 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
16a80 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e  the.** range con
16a90 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75  straint. Or, equ
16aa0 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e  ivalently, the n
16ab0 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74  umber of equalit
16ac0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  y constraints.**
16ad0 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68   optimized by th
16ae0 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78  e proposed index
16af0 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70   scan. For examp
16b00 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  le, assuming ind
16b10 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31  ex p is.** on t1
16b20 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20  (a, b), and the 
16b30 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  SQL query is:.**
16b40 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
16b50 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  1 WHERE a = ? AN
16b60 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20  D b > ? AND b < 
16b70 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
16b80 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70   nEq should be p
16b90 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20  assed the value 
16ba0 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20  1 (as the range 
16bb0 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d  restricted colum
16bc0 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20  n,.** b, is the 
16bd0 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74  second left-most
16be0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
16bf0 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68  ndex). Or, if th
16c00 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  e query is:.**.*
16c10 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
16c20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
16c30 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  a < ? ....**.** 
16c40 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20  then nEq should 
16c50 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a  be passed 0..**.
16c60 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
16c70 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65  value is an inte
16c80 67 65 72 20 64 69 76 69 73 6f 72 20 74 6f 20 72  ger divisor to r
16c90 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d 61  educe the estima
16ca0 74 65 64 0a 2a 2a 20 73 65 61 72 63 68 20 73 70  ted.** search sp
16cb0 61 63 65 2e 20 20 41 20 72 65 74 75 72 6e 20 76  ace.  A return v
16cc0 61 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e 73 20  alue of 1 means 
16cd0 74 68 61 74 20 72 61 6e 67 65 20 63 6f 6e 73 74  that range const
16ce0 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6e 6f  raints are.** no
16cf0 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20 20 41   help at all.  A
16d00 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
16d10 20 32 20 6d 65 61 6e 73 20 72 61 6e 67 65 20 63   2 means range c
16d20 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a  onstraints are.*
16d30 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 72 65  * expected to re
16d40 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20  duce the search 
16d50 73 70 61 63 65 20 62 79 20 68 61 6c 66 2e 20 20  space by half.  
16d60 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a  And so forth....
16d70 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73  **.** In the abs
16d80 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73  ence of sqlite_s
16d90 74 61 74 33 20 41 4e 41 4c 59 5a 45 20 64 61 74  tat3 ANALYZE dat
16da0 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e  a, each range in
16db0 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75  equality.** redu
16dc0 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
16dd0 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72  pace by a factor
16de0 20 6f 66 20 34 2e 20 20 48 65 6e 63 65 20 61 20   of 4.  Hence a 
16df0 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
16e00 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c  t (x>?).** resul
16e10 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f  ts in a return o
16e20 66 20 34 20 61 6e 64 20 61 20 72 61 6e 67 65 20  f 4 and a range 
16e30 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20  constraint (x>? 
16e40 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73  AND x<?) results
16e50 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20  .** in a return 
16e60 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63  of 16..*/.static
16e70 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53   int whereRangeS
16e80 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
16e90 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
16ea0 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
16eb0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
16ec0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
16ed0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
16ee0 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61   The index conta
16ef0 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d  ining the range-
16f00 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b  compared column;
16f10 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45   "x" */.  int nE
16f20 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  q,             /
16f30 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e  * index into p->
16f40 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61  aCol[] of the ra
16f50 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c  nge-compared col
16f60 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  umn */.  WhereTe
16f70 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
16f80 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
16f90 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
16fa0 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
16fb0 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
16fc0 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
16fd0 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
16fe0 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
16ff0 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
17000 20 4e 55 4c 4c 20 2a 2f 0a 20 20 64 6f 75 62 6c   NULL */.  doubl
17010 65 20 2a 70 52 61 6e 67 65 44 69 76 20 20 20 2f  e *pRangeDiv   /
17020 2a 20 4f 55 54 3a 20 52 65 64 75 63 65 20 73 65  * OUT: Reduce se
17030 61 72 63 68 20 73 70 61 63 65 20 62 79 20 74 68  arch space by th
17040 69 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b  is divisor */.){
17050 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17060 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53  TE_OK;..#ifdef S
17070 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17080 54 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  T3..  if( nEq==0
17090 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 29   && p->nSample )
170a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
170b0 6c 75 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a  lue *pRangeVal;.
170c0 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
170d0 65 72 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77  er = 0;.    tRow
170e0 63 6e 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e  cnt iUpper = p->
170f0 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
17100 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
17110 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70     u8 aff = p->p
17120 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
17130 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69  iColumn[0]].affi
17140 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70  nity;..    if( p
17150 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45  Lower ){.      E
17160 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f  xpr *pExpr = pLo
17170 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
17180 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76  ht;.      rc = v
17190 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
171a0 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  rse, pExpr, aff,
171b0 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20   &pRangeVal);.  
171c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77      assert( pLow
171d0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  er->eOperator==W
171e0 4f 5f 47 54 20 7c 7c 20 70 4c 6f 77 65 72 2d 3e  O_GT || pLower->
171f0 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 45  eOperator==WO_GE
17200 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
17210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
17220 20 20 20 26 26 20 77 68 65 72 65 4b 65 79 53 74     && whereKeySt
17230 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
17240 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29 3d  RangeVal, 0, a)=
17250 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
17260 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77   ){.        iLow
17270 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
17280 20 20 20 69 66 28 20 70 4c 6f 77 65 72 2d 3e 65     if( pLower->e
17290 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 20  Operator==WO_GT 
172a0 29 20 69 4c 6f 77 65 72 20 2b 3d 20 61 5b 31 5d  ) iLower += a[1]
172b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
172c0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
172d0 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20  (pRangeVal);.   
172e0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
172f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 55 70 70  QLITE_OK && pUpp
17300 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  er ){.      Expr
17310 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72   *pExpr = pUpper
17320 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
17330 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75  .      rc = valu
17340 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
17350 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70  , pExpr, aff, &p
17360 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20  RangeVal);.     
17370 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72 2d   assert( pUpper-
17380 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
17390 54 20 7c 7c 20 70 55 70 70 65 72 2d 3e 65 4f 70  T || pUpper->eOp
173a0 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 45 20 29 3b  erator==WO_LE );
173b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
173c0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
173d0 26 26 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  && whereKeyStats
173e0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 61 6e  (pParse, p, pRan
173f0 67 65 56 61 6c 2c 20 31 2c 20 61 29 3d 3d 53 51  geVal, 1, a)==SQ
17400 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b  LITE_OK.      ){
17410 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
17420 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  = a[0];.        
17430 69 66 28 20 70 55 70 70 65 72 2d 3e 65 4f 70 65  if( pUpper->eOpe
17440 72 61 74 6f 72 3d 3d 57 4f 5f 4c 45 20 29 20 69  rator==WO_LE ) i
17450 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20  Upper += a[1];. 
17460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
17470 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52  ite3ValueFree(pR
17480 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  angeVal);.    }.
17490 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
174a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
174b0 66 28 20 69 55 70 70 65 72 3c 3d 69 4c 6f 77 65  f( iUpper<=iLowe
174c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  r ){.        *pR
174d0 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c  angeDiv = (doubl
174e0 65 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  e)p->aiRowEst[0]
174f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17500 20 20 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69         *pRangeDi
17510 76 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61  v = (double)p->a
17520 69 52 6f 77 45 73 74 5b 30 5d 2f 28 64 6f 75 62  iRowEst[0]/(doub
17530 6c 65 29 28 69 55 70 70 65 72 20 2d 20 69 4c 6f  le)(iUpper - iLo
17540 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  wer);.      }.  
17550 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
17560 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69  "range scan regi
17570 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64 69 76  ons: %u..%u  div
17580 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%g\n",.        
17590 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 69            (u32)i
175a0 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70 70  Lower, (u32)iUpp
175b0 65 72 2c 20 2a 70 52 61 6e 67 65 44 69 76 29 29  er, *pRangeDiv))
175c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
175d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
175e0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53    }.#else.  UNUS
175f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
17600 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rse);.  UNUSED_P
17610 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55  ARAMETER(p);.  U
17620 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
17630 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nEq);.#endif.  a
17640 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c  ssert( pLower ||
17650 20 70 55 70 70 65 72 20 29 3b 0a 20 20 2a 70 52   pUpper );.  *pR
17660 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c  angeDiv = (doubl
17670 65 29 31 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65  e)1;.  if( pLowe
17680 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74  r && (pLower->wt
17690 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
176a0 4c 4c 29 3d 3d 30 20 29 20 2a 70 52 61 6e 67 65  LL)==0 ) *pRange
176b0 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34  Div *= (double)4
176c0 3b 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 29  ;.  if( pUpper )
176d0 20 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20 28   *pRangeDiv *= (
176e0 64 6f 75 62 6c 65 29 34 3b 0a 20 20 72 65 74 75  double)4;.  retu
176f0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
17700 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17710 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT3./*.** Estim
17720 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
17730 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
17740 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
17750 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61  ed on.** an equa
17760 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
17770 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72  x=VALUE and wher
17780 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63  e that VALUE occ
17790 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69  urs in.** the hi
177a0 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54  stogram data.  T
177b0 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77  his only works w
177c0 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66  hen x is the lef
177d0 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  t-most.** column
177e0 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64   of an index and
177f0 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69   sqlite_stat3 hi
17800 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20  stogram data is 
17810 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72  available.** for
17820 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68   that index.  Wh
17830 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74  en pExpr==NULL t
17840 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  hat means the co
17850 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22  nstraint is.** "
17860 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65  x IS NULL" inste
17870 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e  ad of "x=VALUE".
17880 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
17890 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
178a0 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
178b0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
178c0 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
178d0 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
178e0 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
178f0 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
17900 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
17910 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
17920 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
17930 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
17940 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
17950 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
17960 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
17970 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
17980 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
17990 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
179a0 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
179b0 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
179c0 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
179d0 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
179e0 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
179f0 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
17a00 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
17a10 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53   int whereEqualS
17a20 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
17a30 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
17a40 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
17a50 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
17a60 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
17a70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
17a80 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
17a90 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
17aa0 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20  n is pTerm */.  
17ab0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
17ac0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
17ad0 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20  on for VALUE in 
17ae0 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73  the x=VALUE cons
17af0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 64 6f 75 62  traint */.  doub
17b00 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  le *pnRow       
17b10 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
17b20 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
17b30 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
17b40 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
17b50 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c  Rhs = 0;  /* VAL
17b60 55 45 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  UE on right-hand
17b70 20 73 69 64 65 20 6f 66 20 70 54 65 72 6d 20 2a   side of pTerm *
17b80 2f 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20  /.  u8 aff;     
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17ba0 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   Column affinity
17bb0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bd0 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
17be0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
17bf0 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20  tRowcnt a[2];   
17c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
17c10 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73  tistics */..  as
17c20 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
17c30 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
17c40 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
17c50 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  .  aff = p->pTab
17c60 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
17c70 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74  lumn[0]].affinit
17c80 79 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  y;.  if( pExpr )
17c90 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65  {.    rc = value
17ca0 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
17cb0 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52   pExpr, aff, &pR
17cc0 68 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  hs);.    if( rc 
17cd0 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61  ) goto whereEqua
17ce0 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b  lScanEst_cancel;
17cf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
17d00 68 73 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  hs = sqlite3Valu
17d10 65 4e 65 77 28 70 50 61 72 73 65 2d 3e 64 62 29  eNew(pParse->db)
17d20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 68 73  ;.  }.  if( pRhs
17d30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
17d40 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
17d50 72 63 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  rc = whereKeySta
17d60 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
17d70 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66 28  hs, 0, a);.  if(
17d80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17d90 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  {.    WHERETRACE
17da0 28 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e  (("equality scan
17db0 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c   regions: %d\n",
17dc0 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20   (int)a[1]));.  
17dd0 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
17de0 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61 6c 53  .  }.whereEqualS
17df0 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a 0a 20  canEst_cancel:. 
17e00 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
17e10 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74 75 72  e(pRhs);.  retur
17e20 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
17e30 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
17e40 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a  _ENABLE_STAT3) *
17e50 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
17e60 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a  _ENABLE_STAT3./*
17e70 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
17e80 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
17e90 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
17ea0 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
17eb0 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
17ec0 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
17ed0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
17ee0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
17ef0 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
17f00 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
17f10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
17f20 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
17f30 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
17f40 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
17f50 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
17f60 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
17f70 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
17f80 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
17f90 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
17fa0 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
17fb0 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
17fc0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
17fd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
17fe0 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
17ff0 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
18000 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
18010 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
18020 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
18030 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
18040 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
18050 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
18060 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
18070 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
18080 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
18090 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
180a0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
180b0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
180c0 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
180d0 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
180e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
180f0 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
18100 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
18110 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
18120 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
18130 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
18140 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
18150 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20  n is pTerm */.  
18160 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
18170 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
18180 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48  e list on the RH
18190 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76  S of "x IN (v1,v
181a0 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20  2,v3,...)" */.  
181b0 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20  double *pnRow   
181c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
181d0 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
181e0 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
181f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18200 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
18210 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
18220 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18230 64 6f 75 62 6c 65 20 6e 45 73 74 3b 20 20 20 20  double nEst;    
18240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18250 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f  umber of rows fo
18260 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  r a single term 
18270 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77  */.  double nRow
18280 45 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b  Est = (double)0;
18290 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65   /* New estimate
182a0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
182b0 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20  f rows */.  int 
182c0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
182d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
182e0 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
182f0 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
18300 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
18310 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
18320 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
18330 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73  r; i++){.    nEs
18340 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
18350 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  0];.    rc = whe
18360 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
18370 50 61 72 73 65 2c 20 70 2c 20 70 4c 69 73 74 2d  Parse, p, pList-
18380 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45  >a[i].pExpr, &nE
18390 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  st);.    nRowEst
183a0 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a 20 20   += nEst;.  }.  
183b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
183c0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f  K ){.    if( nRo
183d0 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f 77 45  wEst > p->aiRowE
183e0 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73 74 20  st[0] ) nRowEst 
183f0 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  = p->aiRowEst[0]
18400 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e  ;.    *pnRow = n
18410 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52  RowEst;.    WHER
18420 45 54 52 41 43 45 28 28 22 49 4e 20 72 6f 77 20  ETRACE(("IN row 
18430 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67  estimate: est=%g
18440 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
18450 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18460 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  .}.#endif /* def
18470 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
18480 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a  LE_STAT3) */../*
18490 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
184a0 20 69 66 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20   if column iCol 
184b0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  of the table wit
184c0 68 20 63 75 72 73 6f 72 20 69 54 61 62 20 77 69  h cursor iTab wi
184d0 6c 6c 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  ll appear.** in 
184e0 73 6f 72 74 65 64 20 6f 72 64 65 72 20 61 63 63  sorted order acc
184f0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75  ording to the cu
18500 72 72 65 6e 74 20 71 75 65 72 79 20 70 6c 61 6e  rrent query plan
18510 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 76  ..**.** Return v
18520 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alues:.**.**    
18530 30 20 20 20 69 43 6f 6c 20 69 73 20 6e 6f 74 20  0   iCol is not 
18540 6f 72 64 65 72 65 64 0a 2a 2a 20 20 20 20 31 20  ordered.**    1 
18550 20 20 69 43 6f 6c 20 68 61 73 20 6f 6e 6c 79 20    iCol has only 
18560 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 0a 2a  a single value.*
18570 2a 20 20 20 20 32 20 20 20 69 43 6f 6c 20 69 73  *    2   iCol is
18580 20 69 6e 20 41 53 43 20 6f 72 64 65 72 0a 2a 2a   in ASC order.**
18590 20 20 20 20 33 20 20 20 69 43 6f 6c 20 69 73 20      3   iCol is 
185a0 69 6e 20 44 45 53 43 20 6f 72 64 65 72 0a 2a 2f  in DESC order.*/
185b0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4f 72  .static int isOr
185c0 64 65 72 65 64 43 6f 6c 75 6d 6e 28 0a 20 20 57  deredColumn(.  W
185d0 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 2c 0a  hereBestIdx *p,.
185e0 20 20 69 6e 74 20 69 54 61 62 2c 0a 20 20 69 6e    int iTab,.  in
185f0 74 20 69 43 6f 6c 0a 29 7b 0a 20 20 69 6e 74 20  t iCol.){.  int 
18600 69 2c 20 6a 3b 0a 20 20 57 68 65 72 65 4c 65 76  i, j;.  WhereLev
18610 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 2d  el *pLevel = &p-
18620 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 3b  >aLevel[p->i-1];
18630 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
18640 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a    u8 sortOrder;.
18650 20 20 66 6f 72 28 69 3d 70 2d 3e 69 2d 31 3b 20    for(i=p->i-1; 
18660 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4c 65 76 65  i>=0; i--, pLeve
18670 6c 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  l--){.    if( pL
18680 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 21 3d 69  evel->iTabCur!=i
18690 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Tab ) continue;.
186a0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
186b0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
186c0 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45  WHERE_ALL_UNIQUE
186d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
186e0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
186f0 20 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65    assert( (pLeve
18700 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
18710 26 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29  & WHERE_ORDERED)
18720 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
18730 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
18740 6c 61 6e 2e 75 2e 70 49 64 78 29 21 3d 30 20 29  lan.u.pIdx)!=0 )
18750 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  {.      if( iCol
18760 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f  <0 ){.        so
18770 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20  rtOrder = 0;.   
18780 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
18790 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
187a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56  lags & WHERE_REV
187b0 45 52 53 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  ERSE)!=0 );.    
187c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
187d0 20 69 6e 74 20 6e 20 3d 20 70 49 64 78 2d 3e 6e   int n = pIdx->n
187e0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
187f0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
18800 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
18810 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69  ( iCol==pIdx->ai
18820 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 20 62 72 65 61  Column[j] ) brea
18830 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
18840 20 20 20 20 20 69 66 28 20 6a 3e 3d 6e 20 29 20       if( j>=n ) 
18850 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
18860 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 49    sortOrder = pI
18870 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  dx->aSortOrder[j
18880 5d 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ];.        testc
18890 61 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  ase( (pLevel->pl
188a0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
188b0 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29  RE_REVERSE)!=0 )
188c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
188d0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
188e0 43 6f 6c 21 3d 28 2d 31 29 20 29 20 72 65 74 75  Col!=(-1) ) retu
188f0 72 6e 20 30 3b 0a 20 20 20 20 20 20 73 6f 72 74  rn 0;.      sort
18900 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Order = 0;.     
18910 20 74 65 73 74 63 61 73 65 28 20 28 70 4c 65 76   testcase( (pLev
18920 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
18930 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
18940 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  )!=0 );.    }.  
18950 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
18960 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
18970 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 20  ERE_REVERSE)!=0 
18980 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18990 20 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c   sortOrder==0 ||
189a0 20 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b   sortOrder==1 );
189b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
189c0 20 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b   sortOrder==1 );
189d0 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72  .      sortOrder
189e0 20 3d 20 31 20 2d 20 73 6f 72 74 4f 72 64 65 72   = 1 - sortOrder
189f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
18a00 72 6e 20 73 6f 72 74 4f 72 64 65 72 2b 32 3b 0a  rn sortOrder+2;.
18a10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18a20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
18a30 75 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66  utine decides if
18a40 20 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65   pIdx can be use
18a50 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  d to satisfy the
18a60 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61   ORDER BY.** cla
18a70 75 73 65 2c 20 65 69 74 68 65 72 20 69 6e 20 77  use, either in w
18a80 68 6f 6c 65 20 6f 72 20 69 6e 20 70 61 72 74 2e  hole or in part.
18a90 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
18aa0 75 65 20 69 73 20 74 68 65 20 0a 2a 2a 20 63 75  ue is the .** cu
18ab0 6d 75 6c 61 74 69 76 65 20 6e 75 6d 62 65 72 20  mulative number 
18ac0 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
18ad0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18ae0 74 68 61 74 20 61 72 65 20 73 61 74 69 73 66 69  that are satisfi
18af0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 69 6e 64  ed.** by the ind
18b00 65 78 20 70 49 64 78 20 61 6e 64 20 6f 74 68 65  ex pIdx and othe
18b10 72 20 69 6e 64 69 63 65 73 20 69 6e 20 6f 75 74  r indices in out
18b20 65 72 20 6c 6f 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20  er loops..**.** 
18b30 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
18b40 71 75 65 72 69 65 64 20 68 61 73 20 61 20 63 75  queried has a cu
18b50 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22  rsor number of "
18b60 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20  base".  pIdx is 
18b70 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 74 68 61  the.** index tha
18b80 74 20 69 73 20 70 6f 73 74 75 6c 61 74 65 64 20  t is postulated 
18b90 66 6f 72 20 75 73 65 20 74 6f 20 61 63 63 65 73  for use to acces
18ba0 73 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  s the table..**.
18bb0 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65  ** nEqCol is the
18bc0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
18bd0 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20  ns of pIdx that 
18be0 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61  are used as equa
18bf0 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  lity.** constrai
18c00 6e 74 73 20 61 6e 64 20 77 68 65 72 65 20 74 68  nts and where th
18c10 65 20 6f 74 68 65 72 20 73 69 64 65 20 6f 66 20  e other side of 
18c20 74 68 65 20 3d 3d 20 69 73 20 61 6e 20 6f 72 64  the == is an ord
18c30 65 72 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  ered column.** o
18c40 72 20 63 6f 6e 73 74 61 6e 74 2e 20 20 41 6e 20  r constant.  An 
18c50 22 6f 72 64 65 72 20 63 6f 6c 75 6d 6e 22 20 69  "order column" i
18c60 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
18c70 65 6e 74 65 6e 63 65 20 6d 65 61 6e 73 20 61 20  entence means a 
18c80 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 61 62  column.** in tab
18c90 6c 65 20 66 72 6f 6d 20 61 6e 20 6f 75 74 65 72  le from an outer
18ca0 20 6c 6f 6f 70 20 77 68 6f 73 65 20 76 61 6c 75   loop whose valu
18cb0 65 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 61  es will always a
18cc0 70 70 65 61 72 20 69 6e 20 74 68 65 20 0a 2a 2a  ppear in the .**
18cd0 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 64   correct order d
18ce0 75 65 20 74 6f 20 6f 74 68 72 65 20 69 6e 64 65  ue to othre inde
18cf0 78 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  x, or because th
18d00 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 67 65 6e  e outer loop gen
18d10 65 72 61 74 65 73 0a 2a 2a 20 61 20 75 6e 69 71  erates.** a uniq
18d20 75 65 20 72 65 73 75 6c 74 2e 20 20 41 6e 79 20  ue result.  Any 
18d30 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 45 71  of the first nEq
18d40 43 6f 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70  Col columns of p
18d50 49 64 78 20 6d 61 79 20 62 65 20 6d 69 73 73 69  Idx may be missi
18d60 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 4f  ng.** from the O
18d70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
18d80 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e  nd the match can
18d90 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63   still be a succ
18da0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 2a  ess..**.** The *
18db0 70 62 52 65 76 20 76 61 6c 75 65 20 69 73 20 73  pbRev value is s
18dc0 65 74 20 74 6f 20 30 20 6f 72 64 65 72 20 31 20  et to 0 order 1 
18dd0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
18de0 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 70  ther or not.** p
18df0 49 64 78 20 73 68 6f 75 6c 64 20 62 65 20 72 75  Idx should be ru
18e00 6e 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64  n in the forward
18e10 20 6f 72 64 65 72 20 6f 72 20 69 6e 20 72 65 76   order or in rev
18e20 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  erse order..*/.s
18e30 74 61 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74  tatic int isSort
18e40 69 6e 67 49 6e 64 65 78 28 0a 20 20 57 68 65 72  ingIndex(.  Wher
18e50 65 42 65 73 74 49 64 78 20 2a 70 2c 20 20 20 20  eBestIdx *p,    
18e60 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 73 65  /* Best index se
18e70 61 72 63 68 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arch context */.
18e80 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
18e90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
18ea0 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  ex we are testin
18eb0 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c  g */.  int base,
18ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
18ed0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
18ee0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
18ef0 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  sorted */.  int 
18f00 2a 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20  *pbRev          
18f10 2f 2a 20 53 65 74 20 74 6f 20 31 20 66 6f 72 20  /* Set to 1 for 
18f20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73 63  reverse-order sc
18f30 61 6e 20 6f 66 20 70 49 64 78 20 2a 2f 0a 29 7b  an of pIdx */.){
18f40 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 49   /* Number of pI
18f70 64 78 20 74 65 72 6d 73 20 75 73 65 64 20 2a 2f  dx terms used */
18f80 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
18f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fa0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
18fb0 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
18fc0 69 73 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  isfied */.  int 
18fd0 73 6f 72 74 4f 72 64 65 72 20 3d 20 32 3b 20 20  sortOrder = 2;  
18fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
18ff0 66 6f 72 77 61 72 64 2e 20 20 31 3a 20 62 61 63  forward.  1: bac
19000 6b 77 61 72 64 2e 20 20 32 3a 20 75 6e 6b 6e 6f  kward.  2: unkno
19010 77 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  wn */.  int nTer
19020 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
19030 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19040 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
19050 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  s */.  struct Ex
19060 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 42  prList_item *pOB
19070 49 74 65 6d 3b 2f 2a 20 41 20 74 65 72 6d 20 6f  Item;/* A term o
19080 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
19090 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  lause */.  Table
190a0 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70   *pTab = pIdx->p
190b0 54 61 62 6c 65 3b 20 20 20 2f 2a 20 54 61 62 6c  Table;   /* Tabl
190c0 65 20 74 68 61 74 20 6f 77 6e 73 20 69 6e 64 65  e that owns inde
190d0 78 20 70 49 64 78 20 2a 2f 0a 20 20 45 78 70 72  x pIdx */.  Expr
190e0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
190f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19100 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19110 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
19120 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
19130 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
19140 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
19150 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
19160 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  >db;     /* Data
19170 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
19180 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 69 6f 72 53  */.  int nPriorS
19190 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
191a0 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74     /* ORDER BY t
191b0 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62  erms satisfied b
191c0 79 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f  y outer loops */
191d0 0a 20 20 69 6e 74 20 73 65 65 6e 52 6f 77 69 64  .  int seenRowid
191e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
191f0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 4f   /* True if an O
19200 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 74 65  RDER BY rowid te
19210 72 6d 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  rm is seen */.  
19220 69 6e 74 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c  int uniqueNotNul
19230 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
19240 20 70 49 64 78 20 69 73 20 55 4e 49 51 55 45 20   pIdx is UNIQUE 
19250 77 69 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 61  with all terms a
19260 72 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 0a  re NOT NULL */..
19270 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30 20 29 7b    if( p->i==0 ){
19280 0a 20 20 20 20 6e 50 72 69 6f 72 53 61 74 20 3d  .    nPriorSat =
19290 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
192a0 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 70 2d 3e   nPriorSat = p->
192b0 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70  aLevel[p->i-1].p
192c0 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  lan.nOBSat;.    
192d0 69 66 28 20 28 70 2d 3e 61 4c 65 76 65 6c 5b 70  if( (p->aLevel[p
192e0 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 77 73 46 6c  ->i-1].plan.wsFl
192f0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
19300 52 45 44 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  RED)==0 ){.     
19310 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 63 61   /* This loop ca
19320 6e 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64 20  nnot be ordered 
19330 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 78 74 20  unless the next 
19340 6f 75 74 65 72 20 6c 6f 6f 70 20 69 73 0a 20 20  outer loop is.  
19350 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6f 72 64 65      ** also orde
19360 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  red */.      ret
19370 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20  urn nPriorSat;. 
19380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 4f 70 74     }.    if( Opt
19390 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
193a0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
193b0 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 7b 0a  erByIdxJoin) ){.
193c0 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6c 6f        /* Only lo
193d0 6f 6b 20 61 74 20 74 68 65 20 6f 75 74 65 72 2d  ok at the outer-
193e0 6d 6f 73 74 20 6c 6f 6f 70 20 69 66 20 74 68 65  most loop if the
193f0 20 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 0a   OrderByIdxJoin.
19400 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a        ** optimiz
19410 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c 65  ation is disable
19420 64 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  d */.      retur
19430 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 20  n nPriorSat;.   
19440 20 7d 0a 20 20 7d 0a 20 20 70 4f 72 64 65 72 42   }.  }.  pOrderB
19450 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
19460 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
19470 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  rBy!=0 );.  if( 
19480 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
19490 20 29 7b 0a 20 20 20 20 2f 2a 20 48 61 73 68 20   ){.    /* Hash 
194a0 69 6e 64 69 63 65 73 20 28 69 6e 64 69 63 61 74  indices (indicat
194b0 65 64 20 62 79 20 74 68 65 20 22 75 6e 6f 72 64  ed by the "unord
194c0 65 72 65 64 22 20 74 61 67 20 6f 6e 20 73 71 6c  ered" tag on sql
194d0 69 74 65 5f 73 74 61 74 31 29 20 63 61 6e 6e 6f  ite_stat1) canno
194e0 74 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64  t.    ** be used
194f0 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 2a 2f 0a   for sorting */.
19500 20 20 20 20 72 65 74 75 72 6e 20 6e 50 72 69 6f      return nPrio
19510 72 53 61 74 3b 0a 20 20 7d 0a 20 20 6e 54 65 72  rSat;.  }.  nTer
19520 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  m = pOrderBy->nE
19530 78 70 72 3b 0a 20 20 75 6e 69 71 75 65 4e 6f 74  xpr;.  uniqueNot
19540 4e 75 6c 6c 20 3d 20 70 49 64 78 2d 3e 6f 6e 45  Null = pIdx->onE
19550 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
19560 20 61 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30   assert( nTerm>0
19570 20 29 3b 0a 0a 20 20 2f 2a 20 41 72 67 75 6d 65   );..  /* Argume
19580 6e 74 20 70 49 64 78 20 6d 75 73 74 20 65 69 74  nt pIdx must eit
19590 68 65 72 20 70 6f 69 6e 74 20 74 6f 20 61 20 27  her point to a '
195a0 72 65 61 6c 27 20 6e 61 6d 65 64 20 69 6e 64 65  real' named inde
195b0 78 20 73 74 72 75 63 74 75 72 65 2c 20 0a 20 20  x structure, .  
195c0 2a 2a 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 73  ** or an index s
195d0 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
195e0 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  ed on the stack 
195f0 62 79 20 62 65 73 74 42 74 72 65 65 49 6e 64 65  by bestBtreeInde
19600 78 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 70 72  x() to.  ** repr
19610 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
19620 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 70 61  index that is pa
19630 72 74 20 6f 66 20 65 76 65 72 79 20 74 61 62 6c  rt of every tabl
19640 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
19650 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20   pIdx->zName || 
19660 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  (pIdx->nColumn==
19670 31 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c  1 && pIdx->aiCol
19680 75 6d 6e 5b 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a  umn[0]==-1) );..
19690 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73    /* Match terms
196a0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
196b0 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20   clause against 
196c0 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20  columns of.  ** 
196d0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  the index..  **.
196e0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69    ** Note that i
196f0 6e 64 69 63 65 73 20 68 61 76 65 20 70 49 64 78  ndices have pIdx
19700 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61  ->nColumn regula
19710 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20  r columns plus. 
19720 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e   ** one addition
19730 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  al column contai
19740 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2e 20  ning the rowid. 
19750 20 54 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   The rowid colum
19760 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e  n.  ** of the in
19770 64 65 78 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f  dex is also allo
19780 77 65 64 20 74 6f 20 6d 61 74 63 68 20 61 67 61  wed to match aga
19790 69 6e 73 74 20 74 68 65 20 4f 52 44 45 52 20 42  inst the ORDER B
197a0 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20  Y.  ** clause.. 
197b0 20 2a 2f 0a 20 20 6a 20 3d 20 6e 50 72 69 6f 72   */.  j = nPrior
197c0 53 61 74 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 70  Sat;.  for(i=0,p
197d0 4f 42 49 74 65 6d 3d 26 70 4f 72 64 65 72 42 79  OBItem=&pOrderBy
197e0 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 65 72 6d 20  ->a[j]; j<nTerm 
197f0 26 26 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c  && i<=pIdx->nCol
19800 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  umn; i++){.    E
19810 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
19820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
19830 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
19840 4f 52 44 45 52 20 42 59 20 70 4f 42 49 74 65 6d  ORDER BY pOBItem
19850 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
19860 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
19870 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  /* The collating
19880 20 73 65 71 75 65 6e 63 65 20 6f 66 20 70 4f 42   sequence of pOB
19890 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Expr */.    int 
198a0 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20 20  termSortOrder;  
198b0 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
198c0 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  r for this term 
198d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
198e0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn;            /
198f0 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  * The i-th colum
19900 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
19910 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f   -1 for rowid */
19920 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72  .    int iSortOr
19930 64 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  der;         /* 
19940 31 20 66 6f 72 20 44 45 53 43 2c 20 30 20 66 6f  1 for DESC, 0 fo
19950 72 20 41 53 43 20 6f 6e 20 74 68 65 20 69 2d 74  r ASC on the i-t
19960 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a  h index term */.
19970 20 20 20 20 69 6e 74 20 69 73 45 71 3b 20 20 20      int isEq;   
19980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19990 75 62 6a 65 63 74 20 74 6f 20 61 6e 20 3d 3d 20  ubject to an == 
199a0 6f 72 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74  or IS NULL const
199b0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  raint */.    int
199c0 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
199d0 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
199e0 20 74 65 72 6d 20 6d 61 74 63 68 65 73 20 74 68   term matches th
199f0 65 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a  e index term */.
19a00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19a10 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4e  zColl;      /* N
19a20 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67  ame of collating
19a30 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 69 2d   sequence for i-
19a40 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f  th index term */
19a50 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
19a60 70 43 6f 6e 73 74 72 61 69 6e 74 3b 20 2f 2a 20  pConstraint; /* 
19a70 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  A constraint in 
19a80 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19a90 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   */..    /* If t
19aa0 68 65 20 6e 65 78 74 20 74 65 72 6d 20 6f 66 20  he next term of 
19ab0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
19ac0 75 73 65 20 72 65 66 65 72 73 20 74 6f 20 61 6e  use refers to an
19ad0 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
19ae0 6e 0a 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d  n.    ** a colum
19af0 6e 20 69 6e 20 74 68 65 20 22 62 61 73 65 22 20  n in the "base" 
19b00 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 69 73  table, then this
19b10 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
19b20 62 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 2a 2a  be of any.    **
19b30 20 66 75 72 74 68 65 72 20 75 73 65 20 69 6e 20   further use in 
19b40 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 4f 52 44  handling the ORD
19b50 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20 20 70 4f  ER BY. */.    pO
19b60 42 45 78 70 72 20 3d 20 70 4f 42 49 74 65 6d 2d  BExpr = pOBItem-
19b70 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
19b80 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
19b90 43 4f 4c 55 4d 4e 20 7c 7c 20 70 4f 42 45 78 70  COLUMN || pOBExp
19ba0 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20  r->iTable!=base 
19bb0 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
19bc0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
19bd0 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  nd column number
19be0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
19bf0 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
19c00 6e 65 78 74 20 65 6e 74 72 79 0a 20 20 20 20 2a  next entry.    *
19c10 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  * in the index *
19c20 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  /.    if( pIdx->
19c30 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49 64 78 2d  zName && i<pIdx-
19c40 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
19c50 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
19c60 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
19c70 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
19c80 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  ==pIdx->pTable->
19c90 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
19ca0 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
19cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f       }.      iSo
19cc0 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e  rtOrder = pIdx->
19cd0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20  aSortOrder[i];. 
19ce0 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64       zColl = pId
19cf0 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
19d00 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c      assert( zCol
19d10 6c 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  l!=0 );.    }els
19d20 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  e{.      iColumn
19d30 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f   = -1;.      iSo
19d40 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20  rtOrder = 0;.   
19d50 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     zColl = 0;.  
19d60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
19d70 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
19d80 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
19d90 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
19da0 65 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20  ence of the.    
19db0 2a 2a 20 69 6e 64 65 78 20 6d 61 74 63 68 20 74  ** index match t
19dc0 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
19dd0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
19de0 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 4f  equence of the O
19df0 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63  RDER BY.    ** c
19e00 6c 61 75 73 65 20 65 6e 74 72 79 2e 20 20 53 65  lause entry.  Se
19e10 74 20 69 73 4d 61 74 63 68 20 74 6f 20 31 20 69  t isMatch to 1 i
19e20 66 20 74 68 65 79 20 62 6f 74 68 20 6d 61 74 63  f they both matc
19e30 68 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f  h. */.    if( pO
19e40 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  BExpr->iColumn==
19e50 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
19e60 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20   if( zColl ){.  
19e70 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
19e80 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
19e90 28 70 50 61 72 73 65 2c 20 70 4f 42 45 78 70 72  (pParse, pOBExpr
19ea0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
19eb0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
19ec0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
19ed0 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
19ee0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
19ef0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
19f00 6f 6c 6c 29 3d 3d 30 3b 0a 20 20 20 20 20 20 7d  oll)==0;.      }
19f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
19f20 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20  Match = 1;.     
19f30 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
19f40 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b      isMatch = 0;
19f50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 74  .    }..    /* t
19f60 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 69 73 20  ermSortOrder is 
19f70 30 20 6f 72 20 31 20 66 6f 72 20 77 68 65 74 68  0 or 1 for wheth
19f80 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 63  er or not the ac
19f90 63 65 73 73 20 6c 6f 6f 70 20 73 68 6f 75 6c 64  cess loop should
19fa0 0a 20 20 20 20 2a 2a 20 72 75 6e 20 66 6f 72 77  .    ** run forw
19fb0 61 72 64 20 6f 72 20 62 61 63 6b 77 61 72 64 73  ard or backwards
19fc0 20 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 20   (respectively) 
19fd0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 74 69  in order to sati
19fe0 73 66 79 20 74 68 69 73 20 0a 20 20 20 20 2a 2a  sfy this .    **
19ff0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
1a000 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  ER BY clause. */
1a010 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64  .    termSortOrd
1a020 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72 20  er = iSortOrder 
1a030 5e 20 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f  ^ pOBItem->sortO
1a040 72 64 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  rder;..    /* If
1a050 20 58 20 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e   X is the column
1a060 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 6e   in the index an
1a070 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  d ORDER BY claus
1a080 65 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 0a  e, check to see.
1a090 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20      ** if there 
1a0a0 61 72 65 20 61 6e 79 20 58 3d 20 6f 72 20 58 20  are any X= or X 
1a0b0 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  IS NULL constrai
1a0c0 6e 74 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  nts in the WHERE
1a0d0 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
1a0e0 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 66 69  pConstraint = fi
1a0f0 6e 64 54 65 72 6d 28 70 2d 3e 70 57 43 2c 20 62  ndTerm(p->pWC, b
1a100 61 73 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 70 2d  ase, iColumn, p-
1a110 3e 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20  >notReady,.     
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 20 20 20 20 20 20 57 4f 5f 45 51 7c 57 4f 5f 49        WO_EQ|WO_I
1a140 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 2c 20 70 49 64  SNULL|WO_IN, pId
1a150 78 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  x);.    if( pCon
1a160 73 74 72 61 69 6e 74 3d 3d 30 20 29 7b 0a 20 20  straint==0 ){.  
1a170 20 20 20 20 69 73 45 71 20 3d 20 30 3b 0a 20 20      isEq = 0;.  
1a180 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e    }else if( pCon
1a190 73 74 72 61 69 6e 74 2d 3e 65 4f 70 65 72 61 74  straint->eOperat
1a1a0 6f 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  or==WO_IN ){.   
1a1b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
1a1c0 6c 73 65 20 69 66 28 20 70 43 6f 6e 73 74 72 61  lse if( pConstra
1a1d0 69 6e 74 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  int->eOperator==
1a1e0 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
1a1f0 20 20 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c     uniqueNotNull
1a200 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 73 45 71   = 0;.      isEq
1a210 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
1a220 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
1a230 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20  >prereqRight==0 
1a240 29 7b 0a 20 20 20 20 20 20 69 73 45 71 20 3d 20  ){.      isEq = 
1a250 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1a260 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1a270 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e   = pConstraint->
1a280 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1a290 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
1a2a0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
1a2b0 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  {.        WHERET
1a2c0 52 41 43 45 28 28 22 20 20 20 20 20 20 20 2e 2e  RACE(("       ..
1a2d0 20 69 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e   isOrderedColumn
1a2e0 28 74 61 62 3d 25 64 2c 63 6f 6c 3d 25 64 29 22  (tab=%d,col=%d)"
1a2f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a300 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 54        pRight->iT
1a310 61 62 6c 65 2c 20 70 52 69 67 68 74 2d 3e 69 43  able, pRight->iC
1a320 6f 6c 75 6d 6e 29 29 3b 0a 20 20 20 20 20 20 20  olumn));.       
1a330 20 69 73 45 71 20 3d 20 69 73 4f 72 64 65 72 65   isEq = isOrdere
1a340 64 43 6f 6c 75 6d 6e 28 70 2c 20 70 52 69 67 68  dColumn(p, pRigh
1a350 74 2d 3e 69 54 61 62 6c 65 2c 20 70 52 69 67 68  t->iTable, pRigh
1a360 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t->iColumn);.   
1a370 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1a380 28 22 20 2d 3e 20 69 73 45 71 3d 25 64 5c 6e 22  (" -> isEq=%d\n"
1a390 2c 20 69 73 45 71 29 29 3b 0a 20 20 20 20 20 20  , isEq));.      
1a3a0 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26    if( isMatch &&
1a3b0 20 69 73 45 71 3e 3d 32 20 26 26 20 69 73 45 71   isEq>=2 && isEq
1a3c0 21 3d 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f  !=pOBItem->sortO
1a3d0 72 64 65 72 2b 32 20 29 7b 0a 20 20 20 20 20 20  rder+2 ){.      
1a3e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a3f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1a400 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d  {.        isEq =
1a410 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1a420 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  }.    assert( pO
1a430 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  BItem->sortOrder
1a440 3d 3d 30 20 7c 7c 20 70 4f 42 49 74 65 6d 2d 3e  ==0 || pOBItem->
1a450 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  sortOrder==1 );.
1a460 20 20 20 20 61 73 73 65 72 74 28 20 69 53 6f 72      assert( iSor
1a470 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f  tOrder==0 || iSo
1a480 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20  rtOrder==1 );.  
1a490 20 20 69 66 28 20 21 69 73 4d 61 74 63 68 20 29    if( !isMatch )
1a4a0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 45 71  {.      if( isEq
1a4b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
1a4c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
1a4d0 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  e{.        conti
1a4e0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
1a4f0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 45 71 21   }else if( isEq!
1a500 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
1a510 73 6f 72 74 4f 72 64 65 72 3d 3d 32 20 29 7b 0a  sortOrder==2 ){.
1a520 20 20 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65          sortOrde
1a530 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  r = termSortOrde
1a540 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  r;.      }else i
1a550 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  f( termSortOrder
1a560 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20  !=sortOrder ){. 
1a570 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a580 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a590 6a 2b 2b 3b 0a 20 20 20 20 70 4f 42 49 74 65 6d  j++;.    pOBItem
1a5a0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ++;.    if( iCol
1a5b0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  umn<0 ){.      s
1a5c0 65 65 6e 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20  eenRowid = 1;.  
1a5d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a5e0 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61  else if( pTab->a
1a5f0 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
1a600 4e 75 6c 6c 3d 3d 30 20 26 26 20 69 73 45 71 3d  Null==0 && isEq=
1a610 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 71  =0 ){.      uniq
1a620 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  ueNotNull = 0;. 
1a630 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1a640 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 66 6f  f we have not fo
1a650 75 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  und at least one
1a660 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
1a670 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 0a  hat matches the.
1a680 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
1a690 20 73 68 6f 77 20 6e 6f 20 70 72 6f 67 72 65 73   show no progres
1a6a0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 42 49  s. */.  if( pOBI
1a6b0 74 65 6d 3d 3d 26 70 4f 72 64 65 72 42 79 2d 3e  tem==&pOrderBy->
1a6c0 61 5b 6e 50 72 69 6f 72 53 61 74 5d 20 29 20 72  a[nPriorSat] ) r
1a6d0 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b  eturn nPriorSat;
1a6e0 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
1a6f0 65 20 6e 65 63 65 73 73 61 72 79 20 73 63 61 6e  e necessary scan
1a700 20 6f 72 64 65 72 20 62 61 63 6b 20 74 6f 20 74   order back to t
1a710 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 2a  he caller */.  *
1a720 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65  pbRev = sortOrde
1a730 72 20 26 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  r & 1;..  /* If 
1a740 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
1a750 44 45 52 20 42 59 20 72 6f 77 69 64 22 20 74 65  DER BY rowid" te
1a760 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65 64 2c  rm that matched,
1a770 20 6f 72 20 69 74 20 69 73 20 6f 6e 6c 79 0a 20   or it is only. 
1a780 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   ** possible for
1a790 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 72   a single row fr
1a7a0 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 74 6f  om this table to
1a7b0 20 6d 61 74 63 68 2c 20 74 68 65 6e 20 73 6b 69   match, then ski
1a7c0 70 20 6f 76 65 72 0a 20 20 2a 2a 20 61 6e 79 20  p over.  ** any 
1a7d0 61 64 64 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52  additional ORDER
1a7e0 20 42 59 20 74 65 72 6d 73 20 64 65 61 6c 69 6e   BY terms dealin
1a7f0 67 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  g with this tabl
1a800 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 65  e..  */.  if( se
1a810 65 6e 52 6f 77 69 64 20 7c 7c 20 28 75 6e 69 71  enRowid || (uniq
1a820 75 65 4e 6f 74 4e 75 6c 6c 20 26 26 20 69 3e 3d  ueNotNull && i>=
1a830 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  pIdx->nColumn) )
1a840 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65  {.    /* Advance
1a850 20 6a 20 6f 76 65 72 20 61 64 64 69 74 69 6f 6e   j over addition
1a860 61 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  al ORDER BY term
1a870 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1a880 68 20 62 61 73 65 20 2a 2f 0a 20 20 20 20 57 68  h base */.    Wh
1a890 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 53 20  ereMaskSet *pMS 
1a8a0 3d 20 70 2d 3e 70 57 43 2d 3e 70 4d 61 73 6b 53  = p->pWC->pMaskS
1a8b0 65 74 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  et;.    Bitmask 
1a8c0 6d 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 53  m = ~getMask(pMS
1a8d0 2c 20 62 61 73 65 29 3b 0a 20 20 20 20 77 68 69  , base);.    whi
1a8e0 6c 65 28 20 6a 3c 6e 54 65 72 6d 20 26 26 20 28  le( j<nTerm && (
1a8f0 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
1a900 4d 53 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  MS, pOrderBy->a[
1a910 6a 5d 2e 70 45 78 70 72 29 26 6d 29 3d 3d 30 20  j].pExpr)&m)==0 
1a920 29 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ){.      j++;.  
1a930 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a940 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
1a950 64 20 74 68 65 20 62 65 73 74 20 71 75 65 72 79  d the best query
1a960 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
1a970 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
1a980 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74   table.  Write t
1a990 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79  he.** best query
1a9a0 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f   plan and its co
1a9b0 73 74 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e 63  st into the p->c
1a9c0 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ost..**.** The l
1a9d0 6f 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20  owest cost plan 
1a9e0 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20  wins.  The cost 
1a9f0 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1aa00 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a  f the amount of.
1aa10 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20  ** CPU and disk 
1aa20 49 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20 70 72  I/O needed to pr
1aa30 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73  ocess the reques
1aa40 74 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 46  ted result..** F
1aa50 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c  actors that infl
1aa60 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75  uence cost inclu
1aa70 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  de:.**.**    *  
1aa80 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  The estimated nu
1aa90 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
1aaa0 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  t will be retrie
1aab0 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20  ved.  (The.**   
1aac0 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65      fewer the be
1aad0 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  tter.).**.**    
1aae0 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
1aaf0 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f  t sorting must o
1ab00 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ccur..**.**    *
1ab10 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
1ab20 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73   there must be s
1ab30 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20  eparate lookups 
1ab40 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
1ab50 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65  index and in the
1ab60 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a   main table..**.
1ab70 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  ** If there was 
1ab80 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
1ab90 61 75 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64  ause (pSrc->pInd
1aba0 65 78 29 20 61 74 74 61 63 68 65 64 20 74 6f 20  ex) attached to 
1abb0 74 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  the table in.** 
1abc0 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1abd0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
1abe0 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69  ction only consi
1abf0 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67  ders plans using
1ac00 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69   the .** named i
1ac10 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68  ndex. If no such
1ac20 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20   plan is found, 
1ac30 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65  then the returne
1ac40 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c  d cost is.** SQL
1ac50 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20  ITE_BIG_DBL. If 
1ac60 61 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20  a plan is found 
1ac70 74 68 61 74 20 75 73 65 73 20 74 68 65 20 6e 61  that uses the na
1ac80 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74  med index, .** t
1ac90 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20  hen the cost is 
1aca0 63 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68  calculated in th
1acb0 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a  e usual way..**.
1acc0 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45  ** If a NOT INDE
1acd0 58 45 44 20 63 6c 61 75 73 65 20 28 70 53 72 63  XED clause (pSrc
1ace0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 21 3d 30 29  ->notIndexed!=0)
1acf0 20 77 61 73 20 61 74 74 61 63 68 65 64 20 74 6f   was attached to
1ad00 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 69   the table .** i
1ad10 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
1ad20 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e 6f 20  tement, then no 
1ad30 69 6e 64 65 78 65 73 20 61 72 65 20 63 6f 6e 73  indexes are cons
1ad40 69 64 65 72 65 64 2e 20 48 6f 77 65 76 65 72 2c  idered. However,
1ad50 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65 63 74 65   the .** selecte
1ad60 64 20 70 6c 61 6e 20 6d 61 79 20 73 74 69 6c 6c  d plan may still
1ad70 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   take advantage 
1ad80 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
1ad90 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1ada0 79 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  y.** index..*/.s
1adb0 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 42  tatic void bestB
1adc0 74 72 65 65 49 6e 64 65 78 28 57 68 65 72 65 42  treeIndex(WhereB
1add0 65 73 74 49 64 78 20 2a 70 29 7b 0a 20 20 50 61  estIdx *p){.  Pa
1ade0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
1adf0 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20 54 68 65  >pParse;  /* The
1ae00 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1ae10 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
1ae20 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b  e *pWC = p->pWC;
1ae30 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1ae40 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
1ae50 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1ae60 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
1ae70 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1ae80 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
1ae90 68 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  h */.  int iCur 
1aea0 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b  = pSrc->iCursor;
1aeb0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1aec0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
1aed0 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a   be accessed */.
1aee0 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af00 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
1af10 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
1af20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1af30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af40 43 6f 70 79 20 6f 66 20 70 50 72 6f 62 65 2c 20  Copy of pProbe, 
1af50 6f 72 20 7a 65 72 6f 20 66 6f 72 20 49 50 4b 20  or zero for IPK 
1af60 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 65  index */.  int e
1af70 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20  qTermMask;      
1af80 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1af90 74 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20  t mask of valid 
1afa0 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f  equality operato
1afb0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 45  rs */.  int idxE
1afc0 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20  qTermMask;      
1afd0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6d 61 73      /* Index mas
1afe0 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c  k of valid equal
1aff0 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  ity operators */
1b000 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20  .  Index sPk;   
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b020 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f  * A fake index o
1b030 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72  bject for the pr
1b040 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 74  imary key */.  t
1b050 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74 50  Rowcnt aiRowEstP
1b060 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54 68  k[2];      /* Th
1b070 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c  e aiRowEst[] val
1b080 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
1b090 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 69  ndex */.  int ai
1b0a0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
1b0b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
1b0c0 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
1b0d0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
1b0e0 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 4d 61  /.  int wsFlagMa
1b0f0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1b100 2f 2a 20 41 6c 6c 6f 77 65 64 20 66 6c 61 67 73  /* Allowed flags
1b110 20 69 6e 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e   in p->cost.plan
1b120 2e 77 73 46 6c 61 67 20 2a 2f 0a 0a 20 20 2f 2a  .wsFlag */..  /*
1b130 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1b140 63 6f 73 74 20 74 6f 20 61 20 77 6f 72 73 74 2d  cost to a worst-
1b150 63 61 73 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  case value */.  
1b160 6d 65 6d 73 65 74 28 26 70 2d 3e 63 6f 73 74 2c  memset(&p->cost,
1b170 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f   0, sizeof(p->co
1b180 73 74 29 29 3b 0a 20 20 70 2d 3e 63 6f 73 74 2e  st));.  p->cost.
1b190 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  rCost = SQLITE_B
1b1a0 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49 66  IG_DBL;..  /* If
1b1b0 20 74 68 65 20 70 53 72 63 20 74 61 62 6c 65 20   the pSrc table 
1b1c0 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
1b1d0 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
1b1e0 4e 20 74 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f  N then we may no
1b1f0 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e  t.  ** use an in
1b200 64 65 78 20 74 6f 20 73 61 74 69 73 66 79 20 49  dex to satisfy I
1b210 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  S NULL constrain
1b220 74 73 20 6f 6e 20 74 68 61 74 20 74 61 62 6c 65  ts on that table
1b230 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20  .  This is.  ** 
1b240 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20  because columns 
1b250 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
1b260 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 74  ng NULL if the t
1b270 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  able does not ma
1b280 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72  tch -.  ** a cir
1b290 63 75 6d 73 74 61 6e 63 65 20 77 68 69 63 68 20  cumstance which 
1b2a0 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  the index cannot
1b2b0 20 68 65 6c 70 20 75 73 20 64 69 73 63 6f 76 65   help us discove
1b2c0 72 2e 20 20 54 69 63 6b 65 74 20 23 32 31 37 37  r.  Ticket #2177
1b2d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  ..  */.  if( pSr
1b2e0 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
1b2f0 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 69 64 78  _LEFT ){.    idx
1b300 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  EqTermMask = WO_
1b310 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73  EQ|WO_IN;.  }els
1b320 65 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d  e{.    idxEqTerm
1b330 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
1b340 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20  IN|WO_ISNULL;.  
1b350 7d 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  }..  if( pSrc->p
1b360 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20  Index ){.    /* 
1b370 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  An INDEXED BY cl
1b380 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61  ause specifies a
1b390 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
1b3a0 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  x to use */.    
1b3b0 70 49 64 78 20 3d 20 70 50 72 6f 62 65 20 3d 20  pIdx = pProbe = 
1b3c0 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pSrc->pIndex;.  
1b3d0 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e    wsFlagMask = ~
1b3e0 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c  (WHERE_ROWID_EQ|
1b3f0 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
1b400 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61  E);.    eqTermMa
1b410 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61  sk = idxEqTermMa
1b420 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sk;.  }else{.   
1b430 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
1b440 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1b450 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
1b460 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
1b470 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
1b480 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
1b490 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
1b4a0 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
1b4b0 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
1b4c0 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
1b4d0 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
1b4e0 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
1b4f0 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
1b500 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
1b510 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
1b520 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
1b530 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b550 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
1b560 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
1b570 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
1b580 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
1b590 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
1b5a0 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
1b5b0 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
1b5c0 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
1b5d0 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74      sPk.aiRowEst
1b5e0 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20   = aiRowEstPk;. 
1b5f0 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d     sPk.onError =
1b600 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
1b610 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53   sPk.pTable = pS
1b620 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69  rc->pTab;.    ai
1b630 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53  RowEstPk[0] = pS
1b640 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  rc->pTab->nRowEs
1b650 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
1b660 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46  k[1] = 1;.    pF
1b670 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
1b680 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
1b690 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
1b6a0 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
1b6b0 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
1b6c0 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
1b6d0 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
1b6e0 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
1b6f0 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
1b700 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
1b710 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
1b720 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1b730 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
1b740 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
1b750 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
1b760 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
1b770 3d 20 7e 28 0a 20 20 20 20 20 20 20 20 57 48 45  = ~(.        WHE
1b780 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45  RE_COLUMN_IN|WHE
1b790 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
1b7a0 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57  RE_COLUMN_NULL|W
1b7b0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1b7c0 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 65 71 54  E.    );.    eqT
1b7d0 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
1b7e0 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49 64 78 20  WO_IN;.    pIdx 
1b7f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  = 0;.  }..  /* L
1b800 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
1b810 69 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ices looking for
1b820 20 74 68 65 20 62 65 73 74 20 6f 6e 65 20 74 6f   the best one to
1b830 20 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   use.  */.  for(
1b840 3b 20 70 50 72 6f 62 65 3b 20 70 49 64 78 3d 70  ; pProbe; pIdx=p
1b850 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e  Probe=pProbe->pN
1b860 65 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ext){.    const 
1b870 74 52 6f 77 63 6e 74 20 2a 20 63 6f 6e 73 74 20  tRowcnt * const 
1b880 61 69 52 6f 77 45 73 74 20 3d 20 70 50 72 6f 62  aiRowEst = pProb
1b890 65 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 20  e->aiRowEst;.   
1b8a0 20 57 68 65 72 65 43 6f 73 74 20 70 63 3b 20 20   WhereCost pc;  
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b8c0 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 70 50  Cost of using pP
1b8d0 72 6f 62 65 20 2a 2f 0a 20 20 20 20 64 6f 75 62  robe */.    doub
1b8e0 6c 65 20 6c 6f 67 31 30 4e 20 3d 20 28 64 6f 75  le log10N = (dou
1b8f0 62 6c 65 29 31 3b 20 20 2f 2a 20 62 61 73 65 2d  ble)1;  /* base-
1b900 31 30 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  10 logarithm of 
1b910 6e 52 6f 77 20 28 69 6e 65 78 61 63 74 29 20 2a  nRow (inexact) *
1b920 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  /..    /* The fo
1b930 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
1b940 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  s are populated 
1b950 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70 72 6f  based on the pro
1b960 70 65 72 74 69 65 73 20 6f 66 0a 20 20 20 20 2a  perties of.    *
1b970 2a 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76  * index being ev
1b980 61 6c 75 61 74 65 64 2e 20 54 68 65 79 20 61 72  aluated. They ar
1b990 65 20 74 68 65 6e 20 75 73 65 64 20 74 6f 20 64  e then used to d
1b9a0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65 78 70  etermine the exp
1b9b0 65 63 74 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73  ected.    ** cos
1b9c0 74 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  t and number of 
1b9d0 72 6f 77 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  rows returned.. 
1b9e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 70 63     **.    **  pc
1b9f0 2e 70 6c 61 6e 2e 6e 45 71 3a 20 0a 20 20 20 20  .plan.nEq: .    
1ba00 2a 2a 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20  **    Number of 
1ba10 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 74  equality terms t
1ba20 68 61 74 20 63 61 6e 20 62 65 20 69 6d 70 6c 65  hat can be imple
1ba30 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65  mented using the
1ba40 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20   index..    **  
1ba50 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1ba60 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
1ba70 69 6e 69 74 69 61 6c 20 66 69 65 6c 64 73 20 69  initial fields i
1ba80 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
1ba90 0a 20 20 20 20 2a 2a 20 20 20 20 61 72 65 20 75  .    **    are u
1baa0 73 65 64 20 69 6e 20 3d 3d 20 6f 72 20 49 4e 20  sed in == or IN 
1bab0 6f 72 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  or NOT NULL cons
1bac0 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 57  traints of the W
1bad0 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20  HERE clause..   
1bae0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d   **.    **  nInM
1baf0 75 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20  ul:  .    **    
1bb00 54 68 65 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69  The "in-multipli
1bb10 65 72 22 2e 20 54 68 69 73 20 69 73 20 61 6e 20  er". This is an 
1bb20 65 73 74 69 6d 61 74 65 20 6f 66 20 68 6f 77 20  estimate of how 
1bb30 6d 61 6e 79 20 73 65 65 6b 20 6f 70 65 72 61 74  many seek operat
1bb40 69 6f 6e 73 20 0a 20 20 20 20 2a 2a 20 20 20 20  ions .    **    
1bb50 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66  SQLite must perf
1bb60 6f 72 6d 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  orm on the index
1bb70 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f   in question. Fo
1bb80 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
1bb90 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 57 48 45  e .    **    WHE
1bba0 52 45 20 63 6c 61 75 73 65 20 69 73 3a 0a 20 20  RE clause is:.  
1bbb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1bbc0 20 57 48 45 52 45 20 61 20 49 4e 20 28 31 2c 20   WHERE a IN (1, 
1bbd0 32 2c 20 33 29 20 41 4e 44 20 62 20 49 4e 20 28  2, 3) AND b IN (
1bbe0 34 2c 20 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a  4, 5, 6).    **.
1bbf0 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65      **    SQLite
1bc00 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 39 20   must perform 9 
1bc10 6c 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e  lookups on an in
1bc20 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73  dex on (a, b), s
1bc30 6f 20 6e 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20  o nInMul is .   
1bc40 20 2a 2a 20 20 20 20 73 65 74 20 74 6f 20 39 2e   **    set to 9.
1bc50 20 47 69 76 65 6e 20 74 68 65 20 73 61 6d 65 20   Given the same 
1bc60 73 63 68 65 6d 61 20 61 6e 64 20 65 69 74 68 65  schema and eithe
1bc70 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r of the followi
1bc80 6e 67 20 57 48 45 52 45 20 0a 20 20 20 20 2a 2a  ng WHERE .    **
1bc90 20 20 20 20 63 6c 61 75 73 65 73 3a 0a 20 20 20      clauses:.   
1bca0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1bcb0 57 48 45 52 45 20 61 20 3d 20 20 31 0a 20 20 20  WHERE a =  1.   
1bcc0 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61   **      WHERE a
1bcd0 20 3e 3d 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20   >= 2.    **.   
1bce0 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73   **    nInMul is
1bcf0 20 73 65 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a   set to 1..    *
1bd00 2a 0a 20 20 20 20 2a 2a 20 20 20 20 49 66 20 74  *.    **    If t
1bd10 68 65 72 65 20 65 78 69 73 74 73 20 61 20 57 48  here exists a WH
1bd20 45 52 45 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ERE term of the 
1bd30 66 6f 72 6d 20 22 78 20 49 4e 20 28 53 45 4c 45  form "x IN (SELE
1bd40 43 54 20 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a  CT ...)", then .
1bd50 20 20 20 20 2a 2a 20 20 20 20 74 68 65 20 73 75      **    the su
1bd60 62 2d 73 65 6c 65 63 74 20 69 73 20 61 73 73 75  b-select is assu
1bd70 6d 65 64 20 74 6f 20 72 65 74 75 72 6e 20 32 35  med to return 25
1bd80 20 72 6f 77 73 20 66 6f 72 20 74 68 65 20 70 75   rows for the pu
1bd90 72 70 6f 73 65 73 20 6f 66 20 0a 20 20 20 20 2a  rposes of .    *
1bda0 2a 20 20 20 20 64 65 74 65 72 6d 69 6e 69 6e 67  *    determining
1bdb0 20 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a   nInMul..    **.
1bdc0 20 20 20 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20      **  bInEst: 
1bdd0 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 65 74 20   .    **    Set 
1bde0 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 72 65  to true if there
1bdf0 20 77 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e   was at least on
1be00 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  e "x IN (SELECT 
1be10 2e 2e 2e 29 22 20 74 65 72 6d 20 75 73 65 64 20  ...)" term used 
1be20 0a 20 20 20 20 2a 2a 20 20 20 20 69 6e 20 64 65  .    **    in de
1be30 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 76 61  termining the va
1be40 6c 75 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e 20 20  lue of nInMul.  
1be50 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 52 48  Note that the RH
1be60 53 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  S of the.    ** 
1be70 20 20 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d     IN operator m
1be80 75 73 74 20 62 65 20 61 20 53 45 4c 45 43 54 2c  ust be a SELECT,
1be90 20 6e 6f 74 20 61 20 76 61 6c 75 65 20 6c 69 73   not a value lis
1bea0 74 2c 20 66 6f 72 20 74 68 69 73 20 76 61 72 69  t, for this vari
1beb0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 74  able.    **    t
1bec0 6f 20 62 65 20 74 72 75 65 2e 0a 20 20 20 20 2a  o be true..    *
1bed0 2a 0a 20 20 20 20 2a 2a 20 20 72 61 6e 67 65 44  *.    **  rangeD
1bee0 69 76 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41 6e  iv:.    **    An
1bef0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 61 20 64   estimate of a d
1bf00 69 76 69 73 6f 72 20 62 79 20 77 68 69 63 68 20  ivisor by which 
1bf10 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65  to reduce the se
1bf20 61 72 63 68 20 73 70 61 63 65 20 64 75 65 0a 20  arch space due. 
1bf30 20 20 20 2a 2a 20 20 20 20 74 6f 20 69 6e 65 71     **    to ineq
1bf40 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1bf50 74 73 2e 20 20 49 6e 20 74 68 65 20 61 62 73 65  ts.  In the abse
1bf60 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
1bf70 61 74 33 20 41 4e 41 4c 59 5a 45 0a 20 20 20 20  at3 ANALYZE.    
1bf80 2a 2a 20 20 20 20 64 61 74 61 2c 20 61 20 73 69  **    data, a si
1bf90 6e 67 6c 65 20 69 6e 65 71 75 61 6c 69 74 79 20  ngle inequality 
1bfa0 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
1bfb0 63 68 20 73 70 61 63 65 20 74 6f 20 31 2f 34 72  ch space to 1/4r
1bfc0 64 20 69 74 73 0a 20 20 20 20 2a 2a 20 20 20 20  d its.    **    
1bfd0 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 28 72  original size (r
1bfe0 61 6e 67 65 44 69 76 3d 3d 34 29 2e 20 20 54 77  angeDiv==4).  Tw
1bff0 6f 20 69 6e 65 71 75 61 6c 69 74 69 65 73 20 72  o inequalities r
1c000 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
1c010 0a 20 20 20 20 2a 2a 20 20 20 20 73 70 61 63 65  .    **    space
1c020 20 74 6f 20 31 2f 31 36 74 68 20 6f 66 20 69 74   to 1/16th of it
1c030 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20  s original size 
1c040 28 72 61 6e 67 65 44 69 76 3d 3d 31 36 29 2e 0a  (rangeDiv==16)..
1c050 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62      **.    **  b
1c060 53 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a 2a 20  Sort:   .    ** 
1c070 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65     Boolean. True
1c080 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1c090 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c0a0 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
1c0b0 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20  e an .    **    
1c0c0 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 28 69  external sort (i
1c0d0 2e 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74 68 65  .e. scanning the
1c0e0 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61   index being eva
1c0f0 6c 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f 74 20  luated will not 
1c100 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 72 72 65  .    **    corre
1c110 63 74 6c 79 20 6f 72 64 65 72 20 72 65 63 6f 72  ctly order recor
1c120 64 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ds)..    **.    
1c130 2a 2a 20 20 62 44 69 73 74 3a 0a 20 20 20 20 2a  **  bDist:.    *
1c140 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72  *    Boolean. Tr
1c150 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ue if there is a
1c160 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65   DISTINCT clause
1c170 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69   that will requi
1c180 72 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20  re an .    **   
1c190 20 65 78 74 65 72 6e 61 6c 20 62 74 72 65 65 2e   external btree.
1c1a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1c1b0 62 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a 2a  bLookup: .    **
1c1c0 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75      Boolean. Tru
1c1d0 65 20 69 66 20 61 20 74 61 62 6c 65 20 6c 6f 6f  e if a table loo
1c1e0 6b 75 70 20 69 73 20 72 65 71 75 69 72 65 64 20  kup is required 
1c1f0 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 65  for each index e
1c200 6e 74 72 79 0a 20 20 20 20 2a 2a 20 20 20 20 76  ntry.    **    v
1c210 69 73 69 74 65 64 2e 20 20 49 6e 20 6f 74 68 65  isited.  In othe
1c220 72 20 77 6f 72 64 73 2c 20 74 72 75 65 20 69 66  r words, true if
1c230 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63   this is not a c
1c240 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20  overing index.. 
1c250 20 20 20 2a 2a 20 20 20 20 54 68 69 73 20 69 73     **    This is
1c260 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 66 6f   always false fo
1c270 72 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d  r the rowid prim
1c280 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 6f 66  ary key index of
1c290 20 61 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a   a table..    **
1c2a0 20 20 20 20 46 6f 72 20 6f 74 68 65 72 20 69 6e      For other in
1c2b0 64 65 78 65 73 2c 20 69 74 20 69 73 20 74 72 75  dexes, it is tru
1c2c0 65 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68 65  e unless all the
1c2d0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1c2e0 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20  table.    **    
1c2f0 75 73 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  used by the SELE
1c300 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  CT statement are
1c310 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
1c320 69 6e 64 65 78 20 28 73 75 63 68 20 61 6e 0a 20  index (such an. 
1c330 20 20 20 2a 2a 20 20 20 20 69 6e 64 65 78 20 69     **    index i
1c340 73 20 73 6f 6d 65 74 69 6d 65 73 20 64 65 73 63  s sometimes desc
1c350 72 69 62 65 64 20 61 73 20 61 20 63 6f 76 65 72  ribed as a cover
1c360 69 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20 20 20  ing index)..    
1c370 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c  **    For exampl
1c380 65 2c 20 67 69 76 65 6e 20 74 68 65 20 69 6e 64  e, given the ind
1c390 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68  ex on (a, b), th
1c3a0 65 20 73 65 63 6f 6e 64 20 6f 66 20 74 68 65 20  e second of the 
1c3b0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a  following .    *
1c3c0 2a 20 20 20 20 74 77 6f 20 71 75 65 72 69 65 73  *    two queries
1c3d0 20 72 65 71 75 69 72 65 73 20 74 61 62 6c 65 20   requires table 
1c3e0 62 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20 69  b-tree lookups i
1c3f0 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20  n order to find 
1c400 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  the value.    **
1c410 20 20 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63 2c      of column c,
1c420 20 62 75 74 20 74 68 65 20 66 69 72 73 74 20 64   but the first d
1c430 6f 65 73 20 6e 6f 74 20 62 65 63 61 75 73 65 20  oes not because 
1c440 63 6f 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62 20  columns a and b 
1c450 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 62 6f  are.    **    bo
1c460 74 68 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  th available in 
1c470 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
1c480 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1c490 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62       SELECT a, b
1c4a0 20 20 20 20 46 52 4f 4d 20 74 62 6c 20 57 48 45      FROM tbl WHE
1c4b0 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2a  RE a = 1;.    **
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c               SEL
1c4d0 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  ECT a, b, c FROM
1c4e0 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31   tbl WHERE a = 1
1c4f0 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ;.    */.    int
1c500 20 62 49 6e 45 73 74 20 3d 20 30 3b 20 20 20 20   bInEst = 0;    
1c510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c520 75 65 20 69 66 20 22 78 20 49 4e 20 28 53 45 4c  ue if "x IN (SEL
1c530 45 43 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a 2f  ECT...)" seen */
1c540 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c 20  .    int nInMul 
1c550 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1c560 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c570 64 69 73 74 69 6e 63 74 20 65 71 75 61 6c 69 74  distinct equalit
1c580 69 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a 2f  ies to lookup */
1c590 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 61 6e 67  .    double rang
1c5a0 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 31  eDiv = (double)1
1c5b0 3b 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20  ;  /* Estimated 
1c5c0 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 73 65 61  reduction in sea
1c5d0 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  rch space */.   
1c5e0 20 69 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30 3b   int nBound = 0;
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c600 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e 67  * Number of rang
1c610 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 65  e constraints se
1c620 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53  en */.    int bS
1c630 6f 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ort;            
1c640 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1c650 69 66 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74  if external sort
1c660 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
1c670 20 69 6e 74 20 62 44 69 73 74 3b 20 20 20 20 20   int bDist;     
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c690 2a 20 54 72 75 65 20 69 66 20 69 6e 64 65 78 20  * True if index 
1c6a0 63 61 6e 6e 6f 74 20 68 65 6c 70 20 77 69 74 68  cannot help with
1c6b0 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20   DISTINCT */.   
1c6c0 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20 30   int bLookup = 0
1c6d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c6e0 2a 20 54 72 75 65 20 69 66 20 6e 6f 74 20 61 20  * True if not a 
1c6f0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a  covering index *
1c700 2f 0a 20 20 20 20 69 6e 74 20 6e 50 72 69 6f 72  /.    int nPrior
1c710 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sat;            
1c720 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20      /* ORDER BY 
1c730 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
1c740 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 2a  by outer loops *
1c750 2f 0a 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72  /.    int nOrder
1c760 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
1c770 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c780 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1c790 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1c7a0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1c7b0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1c7c0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1c7d0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66  RE clause */.#if
1c7e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1c7f0 45 5f 53 54 41 54 33 0a 20 20 20 20 57 68 65 72  E_STAT3.    Wher
1c800 65 54 65 72 6d 20 2a 70 46 69 72 73 74 54 65 72  eTerm *pFirstTer
1c810 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69 72  m = 0;    /* Fir
1c820 73 74 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67  st term matching
1c830 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65   the index */.#e
1c840 6e 64 69 66 0a 0a 20 20 20 20 57 48 45 52 45 54  ndif..    WHERET
1c850 52 41 43 45 28 28 0a 20 20 20 20 20 20 22 20 20  RACE((.      "  
1c860 20 25 73 28 25 73 29 3a 5c 6e 22 2c 0a 20 20 20   %s(%s):\n",.   
1c870 20 20 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a     pSrc->pTab->z
1c880 4e 61 6d 65 2c 20 28 70 49 64 78 20 3f 20 70 49  Name, (pIdx ? pI
1c890 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b  dx->zName : "ipk
1c8a0 22 29 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 6d  ").    ));.    m
1c8b0 65 6d 73 65 74 28 26 70 63 2c 20 30 2c 20 73 69  emset(&pc, 0, si
1c8c0 7a 65 6f 66 28 70 63 29 29 3b 0a 20 20 20 20 6e  zeof(pc));.    n
1c8d0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1c8e0 64 65 72 42 79 20 3f 20 70 2d 3e 70 4f 72 64 65  derBy ? p->pOrde
1c8f0 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  rBy->nExpr : 0;.
1c900 20 20 20 20 69 66 28 20 70 2d 3e 69 20 29 7b 0a      if( p->i ){.
1c910 20 20 20 20 20 20 6e 50 72 69 6f 72 53 61 74 20        nPriorSat 
1c920 3d 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  = pc.plan.nOBSat
1c930 20 3d 20 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e   = p->aLevel[p->
1c940 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  i-1].plan.nOBSat
1c950 3b 0a 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20  ;.      bSort = 
1c960 6e 50 72 69 6f 72 53 61 74 3c 6e 4f 72 64 65 72  nPriorSat<nOrder
1c970 42 79 3b 0a 20 20 20 20 20 20 62 44 69 73 74 20  By;.      bDist 
1c980 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1c990 20 20 20 20 20 20 6e 50 72 69 6f 72 53 61 74 20        nPriorSat 
1c9a0 3d 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  = pc.plan.nOBSat
1c9b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 53 6f 72   = 0;.      bSor
1c9c0 74 20 3d 20 6e 4f 72 64 65 72 42 79 3e 30 3b 0a  t = nOrderBy>0;.
1c9d0 20 20 20 20 20 20 62 44 69 73 74 20 3d 20 70 2d        bDist = p-
1c9e0 3e 70 44 69 73 74 69 6e 63 74 21 3d 30 3b 0a 20  >pDistinct!=0;. 
1c9f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 74     }..    /* Det
1ca00 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
1ca10 73 20 6f 66 20 70 63 2e 70 6c 61 6e 2e 6e 45 71  s of pc.plan.nEq
1ca20 20 61 6e 64 20 6e 49 6e 4d 75 6c 20 2a 2f 0a 20   and nInMul */. 
1ca30 20 20 20 66 6f 72 28 70 63 2e 70 6c 61 6e 2e 6e     for(pc.plan.n
1ca40 45 71 3d 30 3b 20 70 63 2e 70 6c 61 6e 2e 6e 45  Eq=0; pc.plan.nE
1ca50 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
1ca60 6e 3b 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b 2b  n; pc.plan.nEq++
1ca70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
1ca80 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
1ca90 6e 5b 70 63 2e 70 6c 61 6e 2e 6e 45 71 5d 3b 0a  n[pc.plan.nEq];.
1caa0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
1cab0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
1cac0 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79  , j, p->notReady
1cad0 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49  , eqTermMask, pI
1cae0 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  dx);.      if( p
1caf0 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
1cb00 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77  .      pc.plan.w
1cb10 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52 45  sFlags |= (WHERE
1cb20 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
1cb30 5f 52 4f 57 49 44 5f 45 51 29 3b 0a 20 20 20 20  _ROWID_EQ);.    
1cb40 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1cb50 6d 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20  m->pWC!=pWC );. 
1cb60 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1cb70 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1cb80 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  N ){.        Exp
1cb90 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
1cba0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
1cbb0 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
1cbc0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
1cbd0 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _IN;.        if(
1cbe0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1cbf0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1cc00 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
1cc10 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c     /* "x IN (SEL
1cc20 45 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75  ECT ...)":  Assu
1cc30 6d 65 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  me the SELECT re
1cc40 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
1cc50 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75  .          nInMu
1cc60 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20  l *= 25;.       
1cc70 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20     bInEst = 1;. 
1cc80 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1cc90 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
1cca0 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d  .pList && pExpr-
1ccb0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1ccc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1ccd0 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
1cce0 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
1ccf0 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20           nInMul 
1cd00 2a 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  *= pExpr->x.pLis
1cd10 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
1cd20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
1cd30 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1cd40 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
1cd50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70   ){.        pc.p
1cd60 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
1cd70 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
1cd80 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
1cd90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1cda0 54 41 54 33 0a 20 20 20 20 20 20 69 66 28 20 70  TAT3.      if( p
1cdb0 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 30 20 26 26  c.plan.nEq==0 &&
1cdc0 20 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65   pProbe->aSample
1cdd0 20 29 20 70 46 69 72 73 74 54 65 72 6d 20 3d 20   ) pFirstTerm = 
1cde0 70 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20  pTerm;.#endif.  
1cdf0 20 20 20 20 70 63 2e 75 73 65 64 20 7c 3d 20 70      pc.used |= p
1ce00 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
1ce10 74 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  t;.    }. .    /
1ce20 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 62  * If the index b
1ce30 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
1ce40 69 73 20 55 4e 49 51 55 45 2c 20 61 6e 64 20 74  is UNIQUE, and t
1ce50 68 65 72 65 20 69 73 20 61 6e 20 65 71 75 61 6c  here is an equal
1ce60 69 74 79 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  ity .    ** cons
1ce70 74 72 61 69 6e 74 20 66 6f 72 20 61 6c 6c 20 63  traint for all c
1ce80 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
1ce90 64 65 78 2c 20 74 68 65 6e 20 74 68 69 73 20 73  dex, then this s
1cea0 65 61 72 63 68 20 77 69 6c 6c 20 66 69 6e 64 0a  earch will find.
1ceb0 20 20 20 20 2a 2a 20 61 74 20 6d 6f 73 74 20 61      ** at most a
1cec0 20 73 69 6e 67 6c 65 20 72 6f 77 2e 20 49 6e 20   single row. In 
1ced0 74 68 69 73 20 63 61 73 65 20 73 65 74 20 74 68  this case set th
1cee0 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 66  e WHERE_UNIQUE f
1cef0 6c 61 67 20 74 6f 20 0a 20 20 20 20 2a 2a 20 69  lag to .    ** i
1cf00 6e 64 69 63 61 74 65 20 74 68 69 73 20 74 6f 20  ndicate this to 
1cf10 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
1cf20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  **.    ** Otherw
1cf30 69 73 65 2c 20 69 66 20 74 68 65 20 73 65 61 72  ise, if the sear
1cf40 63 68 20 6d 61 79 20 66 69 6e 64 20 6d 6f 72 65  ch may find more
1cf50 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 2c 20 74   than one row, t
1cf60 65 73 74 20 74 6f 20 73 65 65 20 69 66 0a 20 20  est to see if.  
1cf70 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
1cf80 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1cf90 20 6f 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   on indexed colu
1cfa0 6d 6e 20 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b  mn (pc.plan.nEq+
1cfb0 31 29 20 74 68 61 74 20 63 61 6e 20 62 65 20 0a  1) that can be .
1cfc0 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 65 64      ** optimized
1cfd0 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78   using the index
1cfe0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
1cff0 28 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 70  ( pc.plan.nEq==p
1d000 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26  Probe->nColumn &
1d010 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f  & pProbe->onErro
1d020 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
1d030 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
1d040 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1d050 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20  WHERE_COLUMN_IN 
1d060 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1d070 65 28 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61  e( pc.plan.wsFla
1d080 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
1d090 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  N_NULL );.      
1d0a0 69 66 28 20 28 70 63 2e 70 6c 61 6e 2e 77 73 46  if( (pc.plan.wsF
1d0b0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
1d0c0 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f  LUMN_IN|WHERE_CO
1d0d0 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29  LUMN_NULL))==0 )
1d0e0 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61  {.        pc.pla
1d0f0 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
1d100 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20  RE_UNIQUE;.     
1d110 20 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30 20 7c     if( p->i==0 |
1d120 7c 20 28 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e  | (p->aLevel[p->
1d130 69 2d 31 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  i-1].plan.wsFlag
1d140 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e  s & WHERE_ALL_UN
1d150 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  IQUE)!=0 ){.    
1d160 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
1d170 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 41  Flags |= WHERE_A
1d180 4c 4c 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20  LL_UNIQUE;.     
1d190 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d1a0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62   }else if( pProb
1d1b0 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  e->bUnordered==0
1d1c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   ){.      int j;
1d1d0 0a 20 20 20 20 20 20 6a 20 3d 20 28 70 63 2e 70  .      j = (pc.p
1d1e0 6c 61 6e 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  lan.nEq==pProbe-
1d1f0 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20  >nColumn ? -1 : 
1d200 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
1d210 5b 70 63 2e 70 6c 61 6e 2e 6e 45 71 5d 29 3b 0a  [pc.plan.nEq]);.
1d220 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65        if( findTe
1d230 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
1d240 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57 4f   p->notReady, WO
1d250 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
1d260 57 4f 5f 47 45 2c 20 70 49 64 78 29 20 29 7b 0a  WO_GE, pIdx) ){.
1d270 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
1d280 6d 20 2a 70 54 6f 70 2c 20 2a 70 42 74 6d 3b 0a  m *pTop, *pBtm;.
1d290 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 66          pTop = f
1d2a0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
1d2b0 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61 64  r, j, p->notRead
1d2c0 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
1d2d0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 70  pIdx);.        p
1d2e0 42 74 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  Btm = findTerm(p
1d2f0 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e  WC, iCur, j, p->
1d300 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
1d310 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a 20 20  WO_GE, pIdx);.  
1d320 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
1d330 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
1d340 70 50 72 6f 62 65 2c 20 70 63 2e 70 6c 61 6e 2e  pProbe, pc.plan.
1d350 6e 45 71 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c  nEq, pBtm, pTop,
1d360 20 26 72 61 6e 67 65 44 69 76 29 3b 0a 20 20 20   &rangeDiv);.   
1d370 20 20 20 20 20 69 66 28 20 70 54 6f 70 20 29 7b       if( pTop ){
1d380 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75 6e  .          nBoun
1d390 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
1d3a0 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
1d3b0 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
1d3c0 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70  MIT;.          p
1d3d0 63 2e 75 73 65 64 20 7c 3d 20 70 54 6f 70 2d 3e  c.used |= pTop->
1d3e0 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
1d3f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1d400 20 70 54 6f 70 2d 3e 70 57 43 21 3d 70 57 43 20   pTop->pWC!=pWC 
1d410 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d420 20 20 20 20 20 69 66 28 20 70 42 74 6d 20 29 7b       if( pBtm ){
1d430 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75 6e  .          nBoun
1d440 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  d++;.          p
1d450 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1d460 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  = WHERE_BTM_LIMI
1d470 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e  T;.          pc.
1d480 75 73 65 64 20 7c 3d 20 70 42 74 6d 2d 3e 70 72  used |= pBtm->pr
1d490 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
1d4a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1d4b0 42 74 6d 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b  Btm->pWC!=pWC );
1d4c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d4d0 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61     pc.plan.wsFla
1d4e0 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c  gs |= (WHERE_COL
1d4f0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
1d500 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20  ROWID_RANGE);.  
1d510 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1d520 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1d530 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1d540 73 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  se and the index
1d550 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
1d560 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61  d will.    ** na
1d570 74 75 72 61 6c 6c 79 20 73 63 61 6e 20 72 6f 77  turally scan row
1d580 73 20 69 6e 20 74 68 65 20 72 65 71 75 69 72 65  s in the require
1d590 64 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65  d order, set the
1d5a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6c 61   appropriate fla
1d5b0 67 73 0a 20 20 20 20 2a 2a 20 69 6e 20 70 63 2e  gs.    ** in pc.
1d5c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2e 20 4f 74  plan.wsFlags. Ot
1d5d0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72  herwise, if ther
1d5e0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1d5f0 20 63 6c 61 75 73 65 20 62 75 74 0a 20 20 20 20   clause but.    
1d600 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  ** the index wil
1d610 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 61  l scan rows in a
1d620 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
1d630 2c 20 73 65 74 20 74 68 65 20 62 53 6f 72 74 0a  , set the bSort.
1d640 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
1d650 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 53 6f    */.    if( bSo
1d660 72 74 20 26 26 20 28 70 53 72 63 2d 3e 6a 6f 69  rt && (pSrc->joi
1d670 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
1d680 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1d690 20 62 52 65 76 20 3d 20 32 3b 0a 20 20 20 20 20   bRev = 2;.     
1d6a0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20   WHERETRACE(("  
1d6b0 20 20 20 20 2d 2d 3e 20 62 65 66 6f 72 65 20 69      --> before i
1d6c0 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 3a 20 6e  sSortingIndex: n
1d6d0 50 72 69 6f 72 53 61 74 3d 25 64 5c 6e 22 2c 6e  PriorSat=%d\n",n
1d6e0 50 72 69 6f 72 53 61 74 29 29 3b 0a 20 20 20 20  PriorSat));.    
1d6f0 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74    pc.plan.nOBSat
1d700 20 3d 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65   = isSortingInde
1d710 78 28 70 2c 20 70 50 72 6f 62 65 2c 20 69 43 75  x(p, pProbe, iCu
1d720 72 2c 20 26 62 52 65 76 29 3b 0a 20 20 20 20 20  r, &bRev);.     
1d730 20 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20   WHERETRACE(("  
1d740 20 20 20 20 2d 2d 3e 20 61 66 74 65 72 20 20 69      --> after  i
1d750 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 3a 20 62  sSortingIndex: b
1d760 52 65 76 3d 25 64 20 6e 4f 42 53 61 74 3d 25 64  Rev=%d nOBSat=%d
1d770 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d780 20 20 20 20 20 20 20 62 52 65 76 2c 20 70 63 2e         bRev, pc.
1d790 70 6c 61 6e 2e 6e 4f 42 53 61 74 29 29 3b 0a 20  plan.nOBSat));. 
1d7a0 20 20 20 20 20 69 66 28 20 6e 50 72 69 6f 72 53       if( nPriorS
1d7b0 61 74 3c 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61  at<pc.plan.nOBSa
1d7c0 74 20 7c 7c 20 28 70 63 2e 70 6c 61 6e 2e 77 73  t || (pc.plan.ws
1d7d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e  Flags & WHERE_UN
1d7e0 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  IQUE)!=0 ){.    
1d7f0 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1d800 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44  ags |= WHERE_ORD
1d810 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERED;.      }.  
1d820 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79      if( nOrderBy
1d830 3d 3d 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  ==pc.plan.nOBSat
1d840 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72   ){.        bSor
1d850 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
1d860 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1d870 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  = WHERE_ROWID_RA
1d880 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  NGE|WHERE_COLUMN
1d890 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 7d 0a  _RANGE;.      }.
1d8a0 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 26        if( bRev &
1d8b0 20 31 20 29 20 70 63 2e 70 6c 61 6e 2e 77 73 46   1 ) pc.plan.wsF
1d8c0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
1d8d0 56 45 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  VERSE;.    }..  
1d8e0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1d8f0 20 61 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c   a DISTINCT qual
1d900 69 66 69 65 72 20 61 6e 64 20 74 68 69 73 20 69  ifier and this i
1d910 6e 64 65 78 20 77 69 6c 6c 20 73 63 61 6e 20 72  ndex will scan r
1d920 6f 77 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 72  ows in.    ** or
1d930 64 65 72 20 6f 66 20 74 68 65 20 44 49 53 54 49  der of the DISTI
1d940 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  NCT expressions,
1d950 20 63 6c 65 61 72 20 62 44 69 73 74 20 61 6e 64   clear bDist and
1d960 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72   set the appropr
1d970 69 61 74 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  iate.    ** flag
1d980 73 20 69 6e 20 70 63 2e 70 6c 61 6e 2e 77 73 46  s in pc.plan.wsF
1d990 6c 61 67 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  lags. */.    if(
1d9a0 20 62 44 69 73 74 0a 20 20 20 20 20 26 26 20 69   bDist.     && i
1d9b0 73 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28 70  sDistinctIndex(p
1d9c0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 50 72 6f  Parse, pWC, pPro
1d9d0 62 65 2c 20 69 43 75 72 2c 20 70 2d 3e 70 44 69  be, iCur, p->pDi
1d9e0 73 74 69 6e 63 74 2c 20 70 63 2e 70 6c 61 6e 2e  stinct, pc.plan.
1d9f0 6e 45 71 29 0a 20 20 20 20 20 26 26 20 28 70 63  nEq).     && (pc
1da00 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1da10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
1da20 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
1da30 20 62 44 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   bDist = 0;.    
1da40 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
1da50 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  s |= WHERE_ROWID
1da60 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c  _RANGE|WHERE_COL
1da70 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
1da80 44 49 53 54 49 4e 43 54 3b 0a 20 20 20 20 7d 0a  DISTINCT;.    }.
1da90 0a 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65  .    /* If curre
1daa0 6e 74 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67  ntly calculating
1dab0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69   the cost of usi
1dac0 6e 67 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74  ng an index (not
1dad0 20 74 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20   the IPK.    ** 
1dae0 69 6e 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e  index), determin
1daf0 65 20 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65  e if all require
1db00 64 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61  d column data ma
1db10 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69  y be obtained wi
1db20 74 68 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73  thout .    ** us
1db30 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62  ing the main tab
1db40 6c 65 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  le (i.e. if the 
1db50 69 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65 72  index is a cover
1db60 69 6e 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ing.    ** index
1db70 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 29   for this query)
1db80 2e 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20  . If it is, set 
1db90 74 68 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  the WHERE_IDX_ON
1dba0 4c 59 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a  LY flag in.    *
1dbb0 2a 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  * pc.plan.wsFlag
1dbc0 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  s. Otherwise, se
1dbd0 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61  t the bLookup va
1dbe0 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65 2e 20  riable to true. 
1dbf0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
1dc00 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
1dc10 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
1dc20 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  sed;.      int j
1dc30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1dc40 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
1dc50 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1dc60 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
1dc70 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
1dc80 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
1dc90 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d  {.          m &=
1dca0 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ~(((Bitmask)1)<
1dcb0 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <x);.        }. 
1dcc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1dcd0 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m==0 ){.       
1dce0 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
1dcf0 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
1dd00 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
1dd10 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70  .        bLookup
1dd20 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1dd30 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1dd40 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
1dd50 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f  number of rows o
1dd60 66 20 6f 75 74 70 75 74 2e 20 20 46 6f 72 20 61  f output.  For a
1dd70 6e 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e  n "x IN (SELECT.
1dd80 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  ..)".    ** cons
1dd90 74 72 61 69 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c  traint, do not l
1dda0 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  et the estimate 
1ddb0 65 78 63 65 65 64 20 68 61 6c 66 20 74 68 65 20  exceed half the 
1ddc0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1ddd0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 63  e..    */.    pc
1dde0 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 28 64 6f  .plan.nRow = (do
1ddf0 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 70  uble)(aiRowEst[p
1de00 63 2e 70 6c 61 6e 2e 6e 45 71 5d 20 2a 20 6e 49  c.plan.nEq] * nI
1de10 6e 4d 75 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  nMul);.    if( b
1de20 49 6e 45 73 74 20 26 26 20 70 63 2e 70 6c 61 6e  InEst && pc.plan
1de30 2e 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74  .nRow*2>aiRowEst
1de40 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 63 2e  [0] ){.      pc.
1de50 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 61 69 52 6f  plan.nRow = aiRo
1de60 77 45 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20  wEst[0]/2;.     
1de70 20 6e 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29 28   nInMul = (int)(
1de80 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f 20 61  pc.plan.nRow / a
1de90 69 52 6f 77 45 73 74 5b 70 63 2e 70 6c 61 6e 2e  iRowEst[pc.plan.
1dea0 6e 45 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  nEq]);.    }..#i
1deb0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1dec0 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 2f 2a 20  LE_STAT3.    /* 
1ded0 49 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  If the constrain
1dee0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
1def0 20 78 3d 56 41 4c 55 45 20 6f 72 20 78 20 49 4e   x=VALUE or x IN
1df00 20 28 45 31 2c 45 32 2c 2e 2e 2e 29 0a 20 20 20   (E1,E2,...).   
1df10 20 2a 2a 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f   ** and we do no
1df20 74 20 74 68 69 6e 6b 20 74 68 61 74 20 76 61 6c  t think that val
1df30 75 65 73 20 6f 66 20 78 20 61 72 65 20 75 6e 69  ues of x are uni
1df40 71 75 65 20 61 6e 64 20 69 66 20 68 69 73 74 6f  que and if histo
1df50 67 72 61 6d 0a 20 20 20 20 2a 2a 20 64 61 74 61  gram.    ** data
1df60 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   is available fo
1df70 72 20 63 6f 6c 75 6d 6e 20 78 2c 20 74 68 65 6e  r column x, then
1df80 20 69 74 20 6d 69 67 68 74 20 62 65 20 70 6f 73   it might be pos
1df90 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 6f 20  sible.    ** to 
1dfa0 67 65 74 20 61 20 62 65 74 74 65 72 20 65 73 74  get a better est
1dfb0 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 6e 75 6d  imate on the num
1dfc0 62 65 72 20 6f 66 20 72 6f 77 73 20 62 61 73 65  ber of rows base
1dfd0 64 20 6f 6e 0a 20 20 20 20 2a 2a 20 56 41 4c 55  d on.    ** VALU
1dfe0 45 20 61 6e 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e  E and how common
1dff0 20 74 68 61 74 20 76 61 6c 75 65 20 69 73 20 61   that value is a
1e000 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
1e010 68 69 73 74 6f 67 72 61 6d 2e 0a 20 20 20 20 2a  histogram..    *
1e020 2f 0a 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61  /.    if( pc.pla
1e030 6e 2e 6e 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31  n.nRow>(double)1
1e040 20 26 26 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d   && pc.plan.nEq=
1e050 3d 31 0a 20 20 20 20 20 26 26 20 70 46 69 72 73  =1.     && pFirs
1e060 74 54 65 72 6d 21 3d 30 20 26 26 20 61 69 52 6f  tTerm!=0 && aiRo
1e070 77 45 73 74 5b 31 5d 3e 31 20 29 7b 0a 20 20 20  wEst[1]>1 ){.   
1e080 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
1e090 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1e0a0 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
1e0b0 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 21 3d 30 20  NULL|WO_IN))!=0 
1e0c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  );.      if( pFi
1e0d0 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1e0e0 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
1e0f0 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  SNULL) ){.      
1e100 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69 72    testcase( pFir
1e110 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1e120 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
1e130 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 46      testcase( pF
1e140 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61  irstTerm->eOpera
1e150 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  tor==WO_ISNULL )
1e160 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 45  ;.        whereE
1e170 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
1e180 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72  se, pProbe, pFir
1e190 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  stTerm->pExpr->p
1e1a0 52 69 67 68 74 2c 0a 20 20 20 20 20 20 20 20 20  Right,.         
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1c0 20 26 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 3b   &pc.plan.nRow);
1e1d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e1e0 20 62 49 6e 45 73 74 3d 3d 30 20 29 7b 0a 20 20   bInEst==0 ){.  
1e1f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
1e200 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61  irstTerm->eOpera
1e210 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  tor==WO_IN );.  
1e220 20 20 20 20 20 20 77 68 65 72 65 49 6e 53 63 61        whereInSca
1e230 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72  nEst(pParse, pPr
1e240 6f 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d  obe, pFirstTerm-
1e250 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c  >pExpr->x.pList,
1e260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e270 20 20 20 20 20 20 20 20 26 70 63 2e 70 6c 61 6e          &pc.plan
1e280 2e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a  .nRow);.      }.
1e290 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1e2a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1e2b0 41 54 33 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41  AT3 */..    /* A
1e2c0 64 6a 75 73 74 20 74 68 65 20 6e 75 6d 62 65 72  djust the number
1e2d0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
1e2e0 61 6e 64 20 64 6f 77 6e 77 61 72 64 20 74 6f 20  and downward to 
1e2f0 72 65 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20  reflect rows.   
1e300 20 2a 2a 20 74 68 61 74 20 61 72 65 20 65 78 63   ** that are exc
1e310 6c 75 64 65 64 20 62 79 20 72 61 6e 67 65 20 63  luded by range c
1e320 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
1e330 2a 2f 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e  */.    pc.plan.n
1e340 52 6f 77 20 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52  Row = pc.plan.nR
1e350 6f 77 2f 72 61 6e 67 65 44 69 76 3b 0a 20 20 20  ow/rangeDiv;.   
1e360 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f   if( pc.plan.nRo
1e370 77 3c 31 20 29 20 70 63 2e 70 6c 61 6e 2e 6e 52  w<1 ) pc.plan.nR
1e380 6f 77 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ow = 1;..    /* 
1e390 45 78 70 65 72 69 6d 65 6e 74 73 20 72 75 6e 20  Experiments run 
1e3a0 6f 6e 20 72 65 61 6c 20 53 51 4c 69 74 65 20 64  on real SQLite d
1e3b0 61 74 61 62 61 73 65 73 20 73 68 6f 77 20 74 68  atabases show th
1e3c0 61 74 20 74 68 65 20 74 69 6d 65 20 6e 65 65 64  at the time need
1e3d0 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 20  ed.    ** to do 
1e3e0 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
1e3f0 74 6f 20 6c 6f 63 61 74 65 20 61 20 72 6f 77 20  to locate a row 
1e400 69 6e 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  in a table or in
1e410 64 65 78 20 69 73 20 72 6f 75 67 68 6c 79 0a 20  dex is roughly. 
1e420 20 20 20 2a 2a 20 6c 6f 67 31 30 28 4e 29 20 74     ** log10(N) t
1e430 69 6d 65 73 20 74 68 65 20 74 69 6d 65 20 74 6f  imes the time to
1e440 20 6d 6f 76 65 20 66 72 6f 6d 20 6f 6e 65 20 72   move from one r
1e450 6f 77 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  ow to the next r
1e460 6f 77 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  ow within.    **
1e470 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
1e480 78 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 74  x.  The actual t
1e490 69 6d 65 73 20 63 61 6e 20 76 61 72 79 2c 20 77  imes can vary, w
1e4a0 69 74 68 20 74 68 65 20 73 69 7a 65 20 6f 66 0a  ith the size of.
1e4b0 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 62      ** records b
1e4c0 65 69 6e 67 20 61 6e 20 69 6d 70 6f 72 74 61 6e  eing an importan
1e4d0 74 20 66 61 63 74 6f 72 2e 20 20 42 6f 74 68 20  t factor.  Both 
1e4e0 6d 6f 76 65 73 20 61 6e 64 20 73 65 61 72 63 68  moves and search
1e4f0 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 6c  es are.    ** sl
1e500 6f 77 65 72 20 77 69 74 68 20 6c 61 72 67 65 72  ower with larger
1e510 20 72 65 63 6f 72 64 73 2c 20 70 72 65 73 75 6d   records, presum
1e520 61 62 6c 79 20 62 65 63 61 75 73 65 20 66 65 77  ably because few
1e530 65 72 20 72 65 63 6f 72 64 73 20 66 69 74 0a 20  er records fit. 
1e540 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67     ** on one pag
1e550 65 20 61 6e 64 20 68 65 6e 63 65 20 6d 6f 72 65  e and hence more
1e560 20 70 61 67 65 73 20 68 61 76 65 20 74 6f 20 62   pages have to b
1e570 65 20 66 65 74 63 68 65 64 2e 0a 20 20 20 20 2a  e fetched..    *
1e580 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 41 4e 41  *.    ** The ANA
1e590 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 20 61 6e 64  LYZE command and
1e5a0 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
1e5b0 31 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  1 and sqlite_sta
1e5c0 74 33 20 74 61 62 6c 65 73 20 64 6f 0a 20 20 20  t3 tables do.   
1e5d0 20 2a 2a 20 6e 6f 74 20 67 69 76 65 20 75 73 20   ** not give us 
1e5e0 64 61 74 61 20 6f 6e 20 74 68 65 20 72 65 6c 61  data on the rela
1e5f0 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 61  tive sizes of ta
1e600 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ble and index re
1e610 63 6f 72 64 73 2e 0a 20 20 20 20 2a 2a 20 53 6f  cords..    ** So
1e620 20 74 68 69 73 20 63 6f 6d 70 75 74 61 74 69 6f   this computatio
1e630 6e 20 61 73 73 75 6d 65 73 20 74 61 62 6c 65 20  n assumes table 
1e640 72 65 63 6f 72 64 73 20 61 72 65 20 61 62 6f 75  records are abou
1e650 74 20 74 77 69 63 65 20 61 73 20 62 69 67 0a 20  t twice as big. 
1e660 20 20 20 2a 2a 20 61 73 20 69 6e 64 65 78 20 72     ** as index r
1e670 65 63 6f 72 64 73 0a 20 20 20 20 2a 2f 0a 20 20  ecords.    */.  
1e680 20 20 69 66 28 20 28 70 63 2e 70 6c 61 6e 2e 77    if( (pc.plan.w
1e690 73 46 6c 61 67 73 26 7e 28 57 48 45 52 45 5f 52  sFlags&~(WHERE_R
1e6a0 45 56 45 52 53 45 7c 57 48 45 52 45 5f 4f 52 44  EVERSE|WHERE_ORD
1e6b0 45 52 45 44 29 29 3d 3d 57 48 45 52 45 5f 49 44  ERED))==WHERE_ID
1e6c0 58 5f 4f 4e 4c 59 0a 20 20 20 20 20 26 26 20 28  X_ONLY.     && (
1e6d0 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  pWC->wctrlFlags 
1e6e0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
1e6f0 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
1e700 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
1e710 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a  lConfig.bUseCis.
1e720 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
1e730 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
1e740 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
1e750 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
1e760 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1e770 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75  s index is not u
1e780 73 65 66 75 6c 20 66 6f 72 20 69 6e 64 65 78 69  seful for indexi
1e790 6e 67 2c 20 62 75 74 20 69 74 20 69 73 20 61 20  ng, but it is a 
1e7a0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
1e7b0 20 20 20 20 20 20 2a 2a 20 41 20 66 75 6c 6c 2d        ** A full-
1e7c0 73 63 61 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  scan of the inde
1e7d0 78 20 6d 69 67 68 74 20 62 65 20 61 20 6c 69 74  x might be a lit
1e7e0 74 6c 65 20 66 61 73 74 65 72 20 74 68 61 6e 20  tle faster than 
1e7f0 61 20 66 75 6c 6c 2d 73 63 61 6e 0a 20 20 20 20  a full-scan.    
1e800 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
1e810 65 2c 20 73 6f 20 67 69 76 65 20 74 68 69 73 20  e, so give this 
1e820 63 61 73 65 20 61 20 63 6f 73 74 20 73 6c 69 67  case a cost slig
1e830 68 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 61  htly less than a
1e840 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
1e850 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 70  scan. */.      p
1e860 63 2e 72 43 6f 73 74 20 3d 20 61 69 52 6f 77 45  c.rCost = aiRowE
1e870 73 74 5b 30 5d 2a 33 20 2b 20 70 50 72 6f 62 65  st[0]*3 + pProbe
1e880 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
1e890 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
1e8a0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 56 45 52 5f   |= WHERE_COVER_
1e8b0 53 43 41 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  SCAN|WHERE_COLUM
1e8c0 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 7d 65 6c  N_RANGE;.    }el
1e8d0 73 65 20 69 66 28 20 28 70 63 2e 70 6c 61 6e 2e  se if( (pc.plan.
1e8e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1e8f0 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
1e900 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1e910 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20   cost of a full 
1e920 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 61 20  table scan is a 
1e930 6e 75 6d 62 65 72 20 6f 66 20 6d 6f 76 65 20 6f  number of move o
1e940 70 65 72 61 74 69 6f 6e 73 20 65 71 75 61 6c 0a  perations equal.
1e950 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
1e960 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1e970 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  n the table..   
1e980 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
1e990 65 20 61 64 64 20 61 6e 20 61 64 64 69 74 69 6f  e add an additio
1e9a0 6e 61 6c 20 34 78 20 70 65 6e 61 6c 74 79 20 74  nal 4x penalty t
1e9b0 6f 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  o full table sca
1e9c0 6e 73 2e 20 20 54 68 69 73 20 63 61 75 73 65 73  ns.  This causes
1e9d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
1e9e0 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 65  st function to e
1e9f0 72 72 20 6f 6e 20 74 68 65 20 73 69 64 65 20 6f  rr on the side o
1ea00 66 20 63 68 6f 6f 73 69 6e 67 20 61 6e 20 69 6e  f choosing an in
1ea10 64 65 78 20 6f 76 65 72 0a 20 20 20 20 20 20 2a  dex over.      *
1ea20 2a 20 63 68 6f 6f 73 69 6e 67 20 61 20 66 75 6c  * choosing a ful
1ea30 6c 20 73 63 61 6e 2e 20 20 54 68 69 73 20 34 78  l scan.  This 4x
1ea40 20 66 75 6c 6c 2d 73 63 61 6e 20 70 65 6e 61 6c   full-scan penal
1ea50 74 79 20 69 73 20 61 6e 20 61 72 67 75 61 62 6c  ty is an arguabl
1ea60 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 69 73  e.      ** decis
1ea70 69 6f 6e 20 61 6e 64 20 6f 6e 65 20 77 68 69 63  ion and one whic
1ea80 68 20 77 65 20 65 78 70 65 63 74 20 74 6f 20 72  h we expect to r
1ea90 65 76 69 73 69 74 20 69 6e 20 74 68 65 20 66 75  evisit in the fu
1eaa0 74 75 72 65 2e 20 20 42 75 74 0a 20 20 20 20 20  ture.  But.     
1eab0 20 2a 2a 20 69 74 20 73 65 65 6d 73 20 74 6f 20   ** it seems to 
1eac0 62 65 20 77 6f 72 6b 69 6e 67 20 77 65 6c 6c 20  be working well 
1ead0 65 6e 6f 75 67 68 20 61 74 20 74 68 65 20 6d 6f  enough at the mo
1eae0 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
1eaf0 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20 3d 20       pc.rCost = 
1eb00 61 69 52 6f 77 45 73 74 5b 30 5d 2a 34 3b 0a 20  aiRowEst[0]*4;. 
1eb10 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46       pc.plan.wsF
1eb20 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
1eb30 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69  DX_ONLY;.      i
1eb40 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
1eb50 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61     pc.plan.wsFla
1eb60 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 4f 52 44  gs &= ~WHERE_ORD
1eb70 45 52 45 44 3b 0a 20 20 20 20 20 20 20 20 70 63  ERED;.        pc
1eb80 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 6e  .plan.nOBSat = n
1eb90 50 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 20 20  PriorSat;.      
1eba0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1ebb0 20 20 20 6c 6f 67 31 30 4e 20 3d 20 65 73 74 4c     log10N = estL
1ebc0 6f 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b  og(aiRowEst[0]);
1ebd0 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20  .      pc.rCost 
1ebe0 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  = pc.plan.nRow;.
1ebf0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20 29        if( pIdx )
1ec00 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 4c  {.        if( bL
1ec10 6f 6f 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20  ookup ){.       
1ec20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64     /* For an ind
1ec30 65 78 20 6c 6f 6f 6b 75 70 20 66 6f 6c 6c 6f 77  ex lookup follow
1ec40 65 64 20 62 79 20 61 20 74 61 62 6c 65 20 6c 6f  ed by a table lo
1ec50 6f 6b 75 70 3a 0a 20 20 20 20 20 20 20 20 20 20  okup:.          
1ec60 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64  **    nInMul ind
1ec70 65 78 20 73 65 61 72 63 68 65 73 20 74 6f 20 66  ex searches to f
1ec80 69 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f 66  ind the start of
1ec90 20 65 61 63 68 20 69 6e 64 65 78 20 72 61 6e 67   each index rang
1eca0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  e.          **  
1ecb0 2b 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72  + nRow steps thr
1ecc0 6f 75 67 68 20 74 68 65 20 69 6e 64 65 78 0a 20  ough the index. 
1ecd0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e           **  + n
1ece0 52 6f 77 20 74 61 62 6c 65 20 73 65 61 72 63 68  Row table search
1ecf0 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  es to lookup the
1ed00 20 74 61 62 6c 65 20 65 6e 74 72 79 20 75 73 69   table entry usi
1ed10 6e 67 20 74 68 65 20 72 6f 77 69 64 0a 20 20 20  ng the rowid.   
1ed20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ed30 20 20 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20      pc.rCost += 
1ed40 28 6e 49 6e 4d 75 6c 20 2b 20 70 63 2e 70 6c 61  (nInMul + pc.pla
1ed50 6e 2e 6e 52 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a  n.nRow)*log10N;.
1ed60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ed70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1ed80 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
1ed90 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  :.          **  
1eda0 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20     nInMul index 
1edb0 73 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64  searches to find
1edc0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74   the initial ent
1edd0 72 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ry .          **
1ede0 20 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20     + nRow steps 
1edf0 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65  through the inde
1ee00 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  x.          */. 
1ee10 20 20 20 20 20 20 20 20 20 70 63 2e 72 43 6f 73           pc.rCos
1ee20 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31  t += nInMul*log1
1ee30 30 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0N;.        }.  
1ee40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ee50 20 20 20 2f 2a 20 46 6f 72 20 61 20 72 6f 77 69     /* For a rowi
1ee60 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6c 6f  d primary key lo
1ee70 6f 6b 75 70 3a 0a 20 20 20 20 20 20 20 20 2a 2a  okup:.        **
1ee80 20 20 20 20 6e 49 6e 4d 75 6c 74 20 74 61 62 6c      nInMult tabl
1ee90 65 20 73 65 61 72 63 68 65 73 20 74 6f 20 66 69  e searches to fi
1eea0 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65  nd the initial e
1eeb0 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 72 61  ntry for each ra
1eec0 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  nge.        **  
1eed0 2b 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72  + nRow steps thr
1eee0 6f 75 67 68 20 74 68 65 20 74 61 62 6c 65 0a 20  ough the table. 
1eef0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ef00 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 6e 49    pc.rCost += nI
1ef10 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20  nMul*log10N;.   
1ef20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1ef30 2f 2a 20 41 64 64 20 69 6e 20 74 68 65 20 65 73  /* Add in the es
1ef40 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20  timated cost of 
1ef50 73 6f 72 74 69 6e 67 20 74 68 65 20 72 65 73 75  sorting the resu
1ef60 6c 74 2e 20 20 41 63 74 75 61 6c 20 65 78 70 65  lt.  Actual expe
1ef70 72 69 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20  rimental.    ** 
1ef80 6d 65 61 73 75 72 65 6d 65 6e 74 73 20 6f 66 20  measurements of 
1ef90 73 6f 72 74 69 6e 67 20 70 65 72 66 6f 72 6d 61  sorting performa
1efa0 6e 63 65 20 69 6e 20 53 51 4c 69 74 65 20 73 68  nce in SQLite sh
1efb0 6f 77 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  ow that sorting 
1efc0 74 69 6d 65 0a 20 20 20 20 2a 2a 20 61 64 64 73  time.    ** adds
1efd0 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e 29 20 74 6f   C*N*log10(N) to
1efe0 20 74 68 65 20 63 6f 73 74 2c 20 77 68 65 72 65   the cost, where
1eff0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1f000 20 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20 0a   of rows to be .
1f010 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 61 6e      ** sorted an
1f020 64 20 43 20 69 73 20 61 20 66 61 63 74 6f 72 20  d C is a factor 
1f030 62 65 74 77 65 65 6e 20 31 2e 39 35 20 61 6e 64  between 1.95 and
1f040 20 34 2e 33 2e 20 20 57 65 20 77 69 6c 6c 20 73   4.3.  We will s
1f050 70 6c 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  plit the.    ** 
1f060 64 69 66 66 65 72 65 6e 63 65 20 61 6e 64 20 73  difference and s
1f070 65 6c 65 63 74 20 43 20 6f 66 20 33 2e 30 2e 0a  elect C of 3.0..
1f080 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62      */.    if( b
1f090 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 64 6f  Sort ){.      do
1f0a0 75 62 6c 65 20 6d 20 3d 20 65 73 74 4c 6f 67 28  uble m = estLog(
1f0b0 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a 28 6e 4f  pc.plan.nRow*(nO
1f0c0 72 64 65 72 42 79 20 2d 20 70 63 2e 70 6c 61 6e  rderBy - pc.plan
1f0d0 2e 6e 4f 42 53 61 74 29 2f 6e 4f 72 64 65 72 42  .nOBSat)/nOrderB
1f0e0 79 29 3b 0a 20 20 20 20 20 20 6d 20 2a 3d 20 28  y);.      m *= (
1f0f0 64 6f 75 62 6c 65 29 28 70 63 2e 70 6c 61 6e 2e  double)(pc.plan.
1f100 6e 4f 42 53 61 74 20 3f 20 32 20 3a 20 33 29 3b  nOBSat ? 2 : 3);
1f110 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20  .      pc.rCost 
1f120 2b 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a  += pc.plan.nRow*
1f130 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  m;.    }.    if(
1f140 20 62 44 69 73 74 20 29 7b 0a 20 20 20 20 20 20   bDist ){.      
1f150 70 63 2e 72 43 6f 73 74 20 2b 3d 20 70 63 2e 70  pc.rCost += pc.p
1f160 6c 61 6e 2e 6e 52 6f 77 2a 65 73 74 4c 6f 67 28  lan.nRow*estLog(
1f170 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 2a 33 3b  pc.plan.nRow)*3;
1f180 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 2a  .    }..    /***
1f190 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
1f1a0 74 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 6e  this index has n
1f1b0 6f 77 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64  ow been computed
1f1c0 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49   ****/..    /* I
1f1d0 66 20 74 68 65 72 65 20 61 72 65 20 61 64 64 69  f there are addi
1f1e0 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e  tional constrain
1f1f0 74 73 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  ts on this table
1f200 20 74 68 61 74 20 63 61 6e 6e 6f 74 0a 20 20 20   that cannot.   
1f210 20 2a 2a 20 62 65 20 75 73 65 64 20 77 69 74 68   ** be used with
1f220 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64   the current ind
1f230 65 78 2c 20 62 75 74 20 77 68 69 63 68 20 6d 69  ex, but which mi
1f240 67 68 74 20 6c 6f 77 65 72 20 74 68 65 20 6e 75  ght lower the nu
1f250 6d 62 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 6f  mber.    ** of o
1f260 75 74 70 75 74 20 72 6f 77 73 2c 20 61 64 6a 75  utput rows, adju
1f270 73 74 20 74 68 65 20 6e 52 6f 77 20 76 61 6c 75  st the nRow valu
1f280 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 20  e accordingly.  
1f290 54 68 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 2a  This only .    *
1f2a0 2a 20 6d 61 74 74 65 72 73 20 69 66 20 74 68 65  * matters if the
1f2b0 20 63 75 72 72 65 6e 74 20 69 6e 64 65 78 20 69   current index i
1f2c0 73 20 74 68 65 20 6c 65 61 73 74 20 63 6f 73 74  s the least cost
1f2d0 6c 79 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f  ly, so do not bo
1f2e0 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 69 74 68  ther.    ** with
1f2f0 20 74 68 69 73 20 73 74 65 70 20 69 66 20 77 65   this step if we
1f300 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68   already know th
1f310 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f  is index will no
1f320 74 20 62 65 20 63 68 6f 73 65 6e 2e 0a 20 20 20  t be chosen..   
1f330 20 2a 2a 20 41 6c 73 6f 2c 20 6e 65 76 65 72 20   ** Also, never 
1f340 72 65 64 75 63 65 20 74 68 65 20 6f 75 74 70 75  reduce the outpu
1f350 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 65 6c 6f  t row count belo
1f360 77 20 32 20 75 73 69 6e 67 20 74 68 69 73 20 73  w 2 using this s
1f370 74 65 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tep..    **.    
1f380 2a 2a 20 49 74 20 69 73 20 63 72 69 74 69 63 61  ** It is critica
1f390 6c 20 74 68 61 74 20 74 68 65 20 6e 6f 74 56 61  l that the notVa
1f3a0 6c 69 64 20 6d 61 73 6b 20 62 65 20 75 73 65 64  lid mask be used
1f3b0 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66   here instead of
1f3c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 6f 74 52  .    ** the notR
1f3d0 65 61 64 79 20 6d 61 73 6b 2e 20 20 57 68 65 6e  eady mask.  When
1f3e0 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 22 6f   computing an "o
1f3f0 70 74 69 6d 61 6c 22 20 69 6e 64 65 78 2c 20 74  ptimal" index, t
1f400 68 65 20 6e 6f 74 52 65 61 64 79 0a 20 20 20 20  he notReady.    
1f410 2a 2a 20 6d 61 73 6b 20 77 69 6c 6c 20 6f 6e 6c  ** mask will onl
1f420 79 20 68 61 76 65 20 6f 6e 65 20 62 69 74 20 73  y have one bit s
1f430 65 74 20 2d 20 74 68 65 20 62 69 74 20 66 6f 72  et - the bit for
1f440 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
1f450 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  le..    ** The n
1f460 6f 74 56 61 6c 69 64 20 6d 61 73 6b 2c 20 6f 6e  otValid mask, on
1f470 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
1f480 20 61 6c 77 61 79 73 20 68 61 73 20 61 6c 6c 20   always has all 
1f490 62 69 74 73 20 73 65 74 20 66 6f 72 0a 20 20 20  bits set for.   
1f4a0 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74 20   ** tables that 
1f4b0 61 72 65 20 6e 6f 74 20 69 6e 20 6f 75 74 65 72  are not in outer
1f4c0 20 6c 6f 6f 70 73 2e 20 20 49 66 20 6e 6f 74 52   loops.  If notR
1f4d0 65 61 64 79 20 69 73 20 75 73 65 64 20 68 65 72  eady is used her
1f4e0 65 20 69 6e 73 74 65 61 64 0a 20 20 20 20 2a 2a  e instead.    **
1f4f0 20 6f 66 20 6e 6f 74 56 61 6c 69 64 2c 20 74 68   of notValid, th
1f500 65 6e 20 61 20 6f 70 74 69 6d 61 6c 20 69 6e 64  en a optimal ind
1f510 65 78 20 74 68 61 74 20 64 65 70 65 6e 64 73 20  ex that depends 
1f520 6f 6e 20 69 6e 6e 65 72 20 6a 6f 69 6e 73 20 6c  on inner joins l
1f530 6f 6f 70 73 0a 20 20 20 20 2a 2a 20 6d 69 67 68  oops.    ** migh
1f540 74 20 62 65 20 73 65 6c 65 63 74 65 64 20 65 76  t be selected ev
1f550 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  en when there ex
1f560 69 73 74 73 20 61 6e 20 6f 70 74 69 6d 61 6c 20  ists an optimal 
1f570 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 0a 20  index that has. 
1f580 20 20 20 2a 2a 20 6e 6f 20 73 75 63 68 20 64 65     ** no such de
1f590 70 65 6e 64 65 6e 63 79 2e 0a 20 20 20 20 2a 2f  pendency..    */
1f5a0 0a 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e  .    if( pc.plan
1f5b0 2e 6e 52 6f 77 3e 32 20 26 26 20 70 63 2e 72 43  .nRow>2 && pc.rC
1f5c0 6f 73 74 3c 3d 70 2d 3e 63 6f 73 74 2e 72 43 6f  ost<=p->cost.rCo
1f5d0 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
1f5e0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1f5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1f600 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
1f610 20 20 69 6e 74 20 6e 53 6b 69 70 45 71 20 3d 20    int nSkipEq = 
1f620 70 63 2e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f  pc.plan.nEq;   /
1f630 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 63  * Number of == c
1f640 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b  onstraints to sk
1f650 69 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ip */.      int 
1f660 6e 53 6b 69 70 52 61 6e 67 65 20 3d 20 6e 42 6f  nSkipRange = nBo
1f670 75 6e 64 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  und;     /* Numb
1f680 65 72 20 6f 66 20 3c 20 63 6f 6e 73 74 72 61 69  er of < constrai
1f690 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  nts to skip */. 
1f6a0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 74 68 69       Bitmask thi
1f6b0 73 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  sTab;           
1f6c0 20 20 2f 2a 20 42 69 74 6d 61 70 20 66 6f 72 20    /* Bitmap for 
1f6d0 70 53 72 63 20 2a 2f 0a 0a 20 20 20 20 20 20 74  pSrc */..      t
1f6e0 68 69 73 54 61 62 20 3d 20 67 65 74 4d 61 73 6b  hisTab = getMask
1f6f0 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  (pWC->pMaskSet, 
1f700 69 43 75 72 29 3b 0a 20 20 20 20 20 20 66 6f 72  iCur);.      for
1f710 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b  (pTerm=pWC->a, k
1f720 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 70 63 2e  =pWC->nTerm; pc.
1f730 70 6c 61 6e 2e 6e 52 6f 77 3e 32 20 26 26 20 6b  plan.nRow>2 && k
1f740 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; k--, pTerm++){
1f750 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
1f760 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1f770 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e  RM_VIRTUAL ) con
1f780 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1f790 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
1f7a0 71 41 6c 6c 20 26 20 70 2d 3e 6e 6f 74 56 61 6c  qAll & p->notVal
1f7b0 69 64 29 21 3d 74 68 69 73 54 61 62 20 29 20 63  id)!=thisTab ) c
1f7c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1f7d0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
1f7e0 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
1f7f0 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
1f800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1f810 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20 20 20   nSkipEq ){.    
1f820 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
1f830 65 20 74 68 65 20 66 69 72 73 74 20 70 63 2e 70  e the first pc.p
1f840 6c 61 6e 2e 6e 45 71 20 65 71 75 61 6c 69 74 79  lan.nEq equality
1f850 20 6d 61 74 63 68 65 73 20 73 69 6e 63 65 20 74   matches since t
1f860 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
1f870 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65       ** has alre
1f880 61 64 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f  ady accounted fo
1f890 72 20 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20  r these */.     
1f8a0 20 20 20 20 20 20 20 6e 53 6b 69 70 45 71 2d 2d         nSkipEq--
1f8b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1f8c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
1f8d0 2a 20 41 73 73 75 6d 65 20 65 61 63 68 20 61 64  * Assume each ad
1f8e0 64 69 74 69 6f 6e 61 6c 20 65 71 75 61 6c 69 74  ditional equalit
1f8f0 79 20 6d 61 74 63 68 20 72 65 64 75 63 65 73 20  y match reduces 
1f900 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
1f910 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69         ** set si
1f920 7a 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ze by a factor o
1f930 66 20 31 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  f 10 */.        
1f940 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77      pc.plan.nRow
1f950 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   /= 10;.        
1f960 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1f970 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
1f980 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
1f990 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
1f9a0 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  E) ){.          
1f9b0 69 66 28 20 6e 53 6b 69 70 52 61 6e 67 65 20 29  if( nSkipRange )
1f9c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1f9d0 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73   Ignore the firs
1f9e0 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 72 61 6e  t nSkipRange ran
1f9f0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73  ge constraints s
1fa00 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20  ince the index. 
1fa10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
1fa20 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e  s already accoun
1fa30 74 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f  ted for these */
1fa40 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b  .            nSk
1fa50 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20 20 20  ipRange--;.     
1fa60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fa70 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
1fa80 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  e each additiona
1fa90 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  l range constrai
1faa0 6e 74 20 72 65 64 75 63 65 73 20 74 68 65 20 72  nt reduces the r
1fab0 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20  esult.          
1fac0 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79    ** set size by
1fad0 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 20   a factor of 3. 
1fae0 20 49 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63   Indexed range c
1faf0 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 64 75 63  onstraints reduc
1fb00 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1fb10 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
1fb20 65 20 62 79 20 61 20 6c 61 72 67 65 72 20 66 61  e by a larger fa
1fb30 63 74 6f 72 3a 20 34 2e 20 20 57 65 20 6d 61 6b  ctor: 4.  We mak
1fb40 65 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65 0a  e indexed range.
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
1fb60 6f 72 65 20 73 65 6c 65 63 74 69 76 65 20 69 6e  ore selective in
1fb70 74 65 6e 74 69 6f 6e 61 6c 6c 79 20 62 65 63 61  tentionally beca
1fb80 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 6a 65  use of the subje
1fb90 63 74 69 76 65 20 0a 20 20 20 20 20 20 20 20 20  ctive .         
1fba0 20 20 20 2a 2a 20 6f 62 73 65 72 76 61 74 69 6f     ** observatio
1fbb0 6e 20 74 68 61 74 20 69 6e 64 65 78 65 64 20 72  n that indexed r
1fbc0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1fbd0 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 6f 72 65   really are more
1fbe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1fbf0 73 65 6c 65 63 74 69 76 65 20 69 6e 20 70 72 61  selective in pra
1fc00 63 74 69 63 65 2c 20 6f 6e 20 61 76 65 72 61 67  ctice, on averag
1fc10 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
1fc20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f    pc.plan.nRow /
1fc30 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 3;.          }
1fc40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1fc50 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1fc60 74 6f 72 21 3d 57 4f 5f 4e 4f 4f 50 20 29 7b 0a  tor!=WO_NOOP ){.
1fc70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79            /* Any
1fc80 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
1fc90 6e 20 6c 6f 77 65 72 73 20 74 68 65 20 6f 75 74  n lowers the out
1fca0 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 79  put row count by
1fcb0 20 68 61 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20   half */.       
1fcc0 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20     pc.plan.nRow 
1fcd0 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  /= 2;.        }.
1fce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1fcf0 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 32  ( pc.plan.nRow<2
1fd00 20 29 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20   ) pc.plan.nRow 
1fd10 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  = 2;.    }...   
1fd20 20 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20   WHERETRACE((.  
1fd30 20 20 20 20 22 20 20 20 20 20 20 6e 45 71 3d 25      "      nEq=%
1fd40 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 72 61 6e 67  d nInMul=%d rang
1fd50 65 44 69 76 3d 25 64 20 62 53 6f 72 74 3d 25 64  eDiv=%d bSort=%d
1fd60 20 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c   bLookup=%d wsFl
1fd70 61 67 73 3d 30 78 25 30 38 78 5c 6e 22 0a 20 20  ags=0x%08x\n".  
1fd80 20 20 20 20 22 20 20 20 20 20 20 6e 6f 74 52 65      "      notRe
1fd90 61 64 79 3d 30 78 25 6c 6c 78 20 6c 6f 67 31 30  ady=0x%llx log10
1fda0 4e 3d 25 2e 31 66 20 6e 52 6f 77 3d 25 2e 31 66  N=%.1f nRow=%.1f
1fdb0 20 63 6f 73 74 3d 25 2e 31 66 5c 6e 22 0a 20 20   cost=%.1f\n".  
1fdc0 20 20 20 20 22 20 20 20 20 20 20 75 73 65 64 3d      "      used=
1fdd0 30 78 25 6c 6c 78 20 6e 4f 42 53 61 74 3d 25 64  0x%llx nOBSat=%d
1fde0 5c 6e 22 2c 0a 20 20 20 20 20 20 70 63 2e 70 6c  \n",.      pc.pl
1fdf0 61 6e 2e 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20  an.nEq, nInMul, 
1fe00 28 69 6e 74 29 72 61 6e 67 65 44 69 76 2c 20 62  (int)rangeDiv, b
1fe10 53 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 70  Sort, bLookup, p
1fe20 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 0a  c.plan.wsFlags,.
1fe30 20 20 20 20 20 20 70 2d 3e 6e 6f 74 52 65 61 64        p->notRead
1fe40 79 2c 20 6c 6f 67 31 30 4e 2c 20 70 63 2e 70 6c  y, log10N, pc.pl
1fe50 61 6e 2e 6e 52 6f 77 2c 20 70 63 2e 72 43 6f 73  an.nRow, pc.rCos
1fe60 74 2c 20 70 63 2e 75 73 65 64 2c 0a 20 20 20 20  t, pc.used,.    
1fe70 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74    pc.plan.nOBSat
1fe80 0a 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a  .    ));..    /*
1fe90 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69   If this index i
1fea0 73 20 74 68 65 20 62 65 73 74 20 77 65 20 68 61  s the best we ha
1feb0 76 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c 20  ve seen so far, 
1fec0 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69 73  then record this
1fed0 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e  .    ** index an
1fee0 64 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74 68  d its cost in th
1fef0 65 20 70 2d 3e 63 6f 73 74 20 73 74 72 75 63 74  e p->cost struct
1ff00 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
1ff10 69 66 28 20 28 21 70 49 64 78 20 7c 7c 20 70 63  if( (!pIdx || pc
1ff20 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29 20 26  .plan.wsFlags) &
1ff30 26 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 26 70  & compareCost(&p
1ff40 63 2c 20 26 70 2d 3e 63 6f 73 74 29 20 29 7b 0a  c, &p->cost) ){.
1ff50 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 20 3d 20        p->cost = 
1ff60 70 63 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73  pc;.      p->cos
1ff70 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
1ff80 3d 20 77 73 46 6c 61 67 4d 61 73 6b 3b 0a 20 20  = wsFlagMask;.  
1ff90 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e      p->cost.plan
1ffa0 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  .u.pIdx = pIdx;.
1ffb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1ffc0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
1ffd0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
1ffe0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
1fff0 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
20000 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
20010 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
20020 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  >pIndex ) break;
20030 0a 0a 20 20 20 20 2f 2a 20 52 65 73 65 74 20 6d  ..    /* Reset m
20040 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6e 65 78  asks for the nex
20050 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6c  t index in the l
20060 6f 6f 70 20 2a 2f 0a 20 20 20 20 77 73 46 6c 61  oop */.    wsFla
20070 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f  gMask = ~(WHERE_
20080 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
20090 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20  OWID_RANGE);.   
200a0 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64   eqTermMask = id
200b0 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d  xEqTermMask;.  }
200c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
200d0 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
200e0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 53 51  lause and the SQ
200f0 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
20100 72 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  r flag.  ** is s
20110 65 74 2c 20 74 68 65 6e 20 72 65 76 65 72 73 65  et, then reverse
20120 20 74 68 65 20 6f 72 64 65 72 20 74 68 61 74 20   the order that 
20130 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 62  the index will b
20140 65 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2a 20 69  e scanned.  ** i
20150 6e 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  n. This is used 
20160 66 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  for application 
20170 74 65 73 74 69 6e 67 2c 20 74 6f 20 68 65 6c 70  testing, to help
20180 20 66 69 6e 64 20 63 61 73 65 73 0a 20 20 2a 2a   find cases.  **
20190 20 77 68 65 72 65 20 61 70 70 6c 69 63 61 74 69   where applicati
201a0 6f 6e 20 62 65 68 61 76 69 6f 75 72 20 64 65 70  on behaviour dep
201b0 65 6e 64 73 20 6f 6e 20 74 68 65 20 28 75 6e 64  ends on the (und
201c0 65 66 69 6e 65 64 29 20 6f 72 64 65 72 20 74 68  efined) order th
201d0 61 74 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 6f  at.  ** SQLite o
201e0 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 69  utputs rows in i
201f0 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
20200 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
20210 75 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21  use.  */.  if( !
20220 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
20230 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
20240 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   & SQLITE_Revers
20250 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 70 2d  eOrder ){.    p-
20260 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
20270 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
20280 52 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  RSE;.  }..  asse
20290 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  rt( p->pOrderBy 
202a0 7c 7c 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e  || (p->cost.plan
202b0 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  .wsFlags&WHERE_O
202c0 52 44 45 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20  RDERED)==0 );.  
202d0 61 73 73 65 72 74 28 20 70 2d 3e 63 6f 73 74 2e  assert( p->cost.
202e0 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 7c  plan.u.pIdx==0 |
202f0 7c 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e  | (p->cost.plan.
20300 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 52 4f  wsFlags&WHERE_RO
20310 57 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a 20 20  WID_EQ)==0 );.  
20320 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 70 49  assert( pSrc->pI
20330 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20  ndex==0 .       
20340 7c 7c 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e  || p->cost.plan.
20350 75 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20 20  u.pIdx==0 .     
20360 20 20 7c 7c 20 70 2d 3e 63 6f 73 74 2e 70 6c 61    || p->cost.pla
20370 6e 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e  n.u.pIdx==pSrc->
20380 70 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20  pIndex .  );..  
20390 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20 20  WHERETRACE(("   
203a0 62 65 73 74 20 69 6e 64 65 78 20 69 73 3a 20 25  best index is: %
203b0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  s\n",.         p
203c0 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49  ->cost.plan.u.pI
203d0 64 78 20 3f 20 70 2d 3e 63 6f 73 74 2e 70 6c 61  dx ? p->cost.pla
203e0 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  n.u.pIdx->zName 
203f0 3a 20 22 69 70 6b 22 29 29 3b 0a 20 20 0a 20 20  : "ipk"));.  .  
20400 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
20410 78 28 70 29 3b 0a 20 20 62 65 73 74 41 75 74 6f  x(p);.  bestAuto
20420 6d 61 74 69 63 49 6e 64 65 78 28 70 29 3b 0a 20  maticIndex(p);. 
20430 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
20440 46 6c 61 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d  Flags |= eqTermM
20450 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  ask;.}../*.** Fi
20460 6e 64 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  nd the query pla
20470 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  n for accessing 
20480 74 61 62 6c 65 20 70 53 72 63 2d 3e 70 54 61 62  table pSrc->pTab
20490 2e 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62  . Write the.** b
204a0 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61  est query plan a
204b0 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f  nd its cost into
204c0 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f   the WhereCost o
204d0 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20 0a  bject supplied .
204e0 2a 2a 20 61 73 20 74 68 65 20 6c 61 73 74 20 70  ** as the last p
204f0 61 72 61 6d 65 74 65 72 2e 20 54 68 69 73 20 66  arameter. This f
20500 75 6e 63 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63  unction may calc
20510 75 6c 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f  ulate the cost o
20520 66 0a 2a 2a 20 62 6f 74 68 20 72 65 61 6c 20 61  f.** both real a
20530 6e 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  nd virtual table
20540 20 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   scans..**.** Th
20550 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
20560 20 6e 6f 74 20 74 61 6b 65 20 4f 52 44 45 52 20   not take ORDER 
20570 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 69  BY or DISTINCT i
20580 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 20 20 4e 6f  nto account.  No
20590 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 72 65 6d  r.** does it rem
205a0 65 6d 62 65 72 20 74 68 65 20 76 69 72 74 75 61  ember the virtua
205b0 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 70 6c  l table query pl
205c0 61 6e 2e 20 20 41 6c 6c 20 69 74 20 64 6f 65 73  an.  All it does
205d0 20 69 73 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   is compute.** t
205e0 68 65 20 63 6f 73 74 20 77 68 69 6c 65 20 64 65  he cost while de
205f0 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 6e 20  termining if an 
20600 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
20610 69 73 20 61 70 70 6c 69 63 61 62 6c 65 2e 20 20  is applicable.  
20620 54 68 65 0a 2a 2a 20 64 65 74 61 69 6c 73 20 77  The.** details w
20630 69 6c 6c 20 62 65 20 72 65 63 6f 6e 73 69 64 65  ill be reconside
20640 72 65 64 20 6c 61 74 65 72 20 69 66 20 74 68 65  red later if the
20650 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
20660 20 66 6f 75 6e 64 20 74 6f 20 62 65 0a 2a 2a 20   found to be.** 
20670 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2f 0a 73  applicable..*/.s
20680 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49  tatic void bestI
20690 6e 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64  ndex(WhereBestId
206a0 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
206b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
206c0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
206d0 56 69 72 74 75 61 6c 28 70 2d 3e 70 53 72 63 2d  Virtual(p->pSrc-
206e0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  >pTab) ){.    sq
206f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
20700 20 2a 70 49 64 78 49 6e 66 6f 20 3d 20 30 3b 0a   *pIdxInfo = 0;.
20710 20 20 20 20 70 2d 3e 70 70 49 64 78 49 6e 66 6f      p->ppIdxInfo
20720 20 3d 20 26 70 49 64 78 49 6e 66 6f 3b 0a 20 20   = &pIdxInfo;.  
20730 20 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64    bestVirtualInd
20740 65 78 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  ex(p);.    if( p
20750 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
20760 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20  reeIdxStr ){.   
20770 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20780 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
20790 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
207a0 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70 50  ite3DbFree(p->pP
207b0 61 72 73 65 2d 3e 64 62 2c 20 70 49 64 78 49 6e  arse->db, pIdxIn
207c0 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  fo);.  }else.#en
207d0 64 69 66 0a 20 20 7b 0a 20 20 20 20 62 65 73 74  dif.  {.    best
207e0 42 74 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 20  BtreeIndex(p);. 
207f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61   }.}../*.** Disa
20800 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
20810 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
20820 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
20830 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
20840 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
20850 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
20860 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
20870 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
20880 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
20890 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
208a0 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
208b0 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
208c0 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
208d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
208e0 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
208f0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
20900 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
20910 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
20920 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
20930 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
20940 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
20950 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
20960 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
20970 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
20980 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
20990 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
209a0 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
209b0 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
209c0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
209d0 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
209e0 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
209f0 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
20a00 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
20a10 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
20a20 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
20a30 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
20a40 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
20a50 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
20a60 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
20a70 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  bled..**.** IMPL
20a80 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
20a90 2d 32 34 35 39 37 2d 35 38 36 35 35 20 4e 6f 20  -24597-58655 No 
20aa0 74 65 73 74 73 20 61 72 65 20 64 6f 6e 65 20 66  tests are done f
20ab0 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  or terms that ar
20ac0 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e.** completely 
20ad0 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
20ae0 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  ices..**.** Disa
20af0 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
20b00 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
20b10 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
20b20 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
20b30 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
20b40 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
20b50 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
20b60 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
20b70 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
20b80 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
20b90 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
20ba0 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
20bb0 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
20bc0 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
20bd0 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
20be0 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
20bf0 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
20c00 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
20c10 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
20c20 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
20c30 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
20c40 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
20c50 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
20c60 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
20c70 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
20c80 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
20c90 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
20ca0 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
20cb0 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
20cc0 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
20cd0 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
20ce0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
20cf0 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
20d00 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
20d10 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65  rm.      && (pTe
20d20 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
20d30 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20  RM_CODED)==0.   
20d40 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
20d50 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
20d60 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20d70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
20d80 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a  FromJoin)).  ){.
20d90 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
20da0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
20db0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
20dc0 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
20dd0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
20de0 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
20df0 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
20e00 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
20e10 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
20e20 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
20e30 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
20e40 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
20e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20e60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
20e70 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
20e80 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20  opcode to apply 
20e90 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
20ea0 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a  ity string zAff.
20eb0 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69  ** to the n regi
20ec0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
20ed0 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41  t base. .**.** A
20ee0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
20ef0 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
20f00 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63  NE entries (whic
20f10 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74  h are no-ops) at
20f20 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e   the.** beginnin
20f30 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66  g and end of zAf
20f40 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20  f are ignored.  
20f50 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
20f60 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51  n zAff are.** SQ
20f70 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74  LITE_AFF_NONE, t
20f80 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73  hen no code gets
20f90 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a   generated..**.*
20fa0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
20fb0 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70  akes its own cop
20fc0 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61  y of zAff so tha
20fd0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  t the caller is 
20fe0 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66  free.** to modif
20ff0 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69  y zAff after thi
21000 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
21010 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
21020 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e  d codeApplyAffin
21030 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
21040 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74  e, int base, int
21050 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b   n, char *zAff){
21060 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
21070 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
21080 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zAff==0 ){.   
21090 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
210a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
210b0 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
210c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76  .  }.  assert( v
210d0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a  !=0 );..  /* Adj
210e0 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74  ust base and n t
210f0 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49  o skip over SQLI
21100 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
21110 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ies at the begin
21120 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e  ning.  ** and en
21130 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74  d of the affinit
21140 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  y string..  */. 
21150 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
21160 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[0]==SQLITE_A
21170 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
21180 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a  --;.    base++;.
21190 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a      zAff++;.  }.
211a0 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
211b0 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54  zAff[n-1]==SQLIT
211c0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
211d0 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    n--;.  }..  /*
211e0 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66   Code the OP_Aff
211f0 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20  inity opcode if 
21200 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e  there is anythin
21210 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f  g left to do. */
21220 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
21230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21240 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
21250 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
21260 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
21270 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
21280 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  f, n);.    sqlit
21290 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
212a0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
212b0 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
212c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
212d0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
212e0 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
212f0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
21300 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
21310 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
21320 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
21330 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
21340 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
21350 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
21360 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
21370 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
21380 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
21390 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
213a0 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
213b0 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
213c0 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
213d0 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
213e0 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
213f0 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
21400 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
21410 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
21420 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
21430 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
21440 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
21450 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
21460 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
21470 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
21480 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
21490 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
214a0 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
214b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
214c0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
214d0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
214e0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
214f0 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
21500 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
21510 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
21520 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
21530 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65  el, /* When leve
21540 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
21550 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
21560 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
21570 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20  iTarget         
21580 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65  /* Attempt to le
21590 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ave results in t
215a0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
215b0 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
215c0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
215d0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
215e0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
215f0 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
21600 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
21610 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  r holding result
21620 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
21630 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69  iTarget>0 );.  i
21640 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  f( pX->op==TK_EQ
21650 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73   ){.    iReg = s
21660 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
21670 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d  rget(pParse, pX-
21680 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74  >pRight, iTarget
21690 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
216a0 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  X->op==TK_ISNULL
216b0 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   ){.    iReg = i
216c0 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69  Target;.    sqli
216d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
216e0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65   OP_Null, 0, iRe
216f0 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
21700 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
21710 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
21720 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74  t eType;.    int
21730 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63   iTab;.    struc
21740 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a  t InLoop *pIn;..
21750 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
21760 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
21770 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
21780 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c  .    eType = sql
21790 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
217a0 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a  pParse, pX, 0);.
217b0 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
217c0 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
217d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
217e0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
217f0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
21800 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
21810 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
21820 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28  _ABLE );.    if(
21830 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
21840 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
21850 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
21860 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
21870 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
21880 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
21890 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
218a0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
218b0 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
218c0 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
218d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
218e0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
218f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
21920 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
21930 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
21940 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
21950 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
21960 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
21970 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
21980 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
21990 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
219a0 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
219b0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
219c0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
219d0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
219e0 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
219f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21a00 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
21a10 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
21a20 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
21a30 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
21a40 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
21a50 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
21a60 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
21a70 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
21a80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
21a90 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a  _IsNull, iReg);.
21aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21ab0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
21ac0 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
21ad0 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
21ae0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
21af0 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  erm);.  return i
21b00 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
21b10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
21b20 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61   will evaluate a
21b30 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  ll == and IN con
21b40 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a  straints for an.
21b50 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  ** index..**.** 
21b60 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
21b70 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
21b80 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
21b90 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
21ba0 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
21bb0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
21bc0 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
21bd0 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
21be0 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
21bf0 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
21c00 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
21c10 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
21c20 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
21c30 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
21c40 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
21c50 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
21c60 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
21c70 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
21c80 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
21c90 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
21ca0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
21cb0 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
21cc0 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
21cd0 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
21ce0 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
21cf0 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  d b will be stor
21d00 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75  ed.** in consecu
21d10 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
21d20 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  nd the index of 
21d30 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
21d40 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
21d50 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
21d60 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
21d70 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
21d80 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
21d90 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
21da0 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
21db0 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
21dc0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
21dd0 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
21de0 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
21df0 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
21e00 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
21e10 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
21e20 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65  l and.** compute
21e30 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
21e40 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
21e50 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
21e60 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61  allocates at lea
21e70 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65  st one memory ce
21e80 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  ll and returns.*
21e90 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * the index of t
21ea0 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  hat memory cell.
21eb0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
21ec0 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
21ed0 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68  tine will use th
21ee0 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  at memory cell t
21ef0 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d  o store the term
21f00 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76  ination.** key v
21f10 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
21f20 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
21f30 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
21f40 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
21f50 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
21f60 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
21f70 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
21f80 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
21f90 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  l.** use..**.** 
21fa0 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
21fb0 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20  , *pzAff is set 
21fc0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
21fd0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
21fe0 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65  a.** copy of the
21ff0 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
22000 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69   string of the i
22010 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75  ndex allocated u
22020 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44  sing.** sqlite3D
22030 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70  bMalloc(). Excep
22040 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  t, entries in th
22050 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  e copy of the st
22060 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a  ring associated.
22070 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79  ** with equality
22080 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
22090 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e  t use NONE affin
220a0 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a  ity are set to.*
220b0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
220c0 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65  E. This is to de
220d0 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68  al with SQL such
220e0 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   as the followin
220f0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
22100 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58  E TABLE t1(a TEX
22110 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  T PRIMARY KEY, b
22120 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e  );.**   SELECT .
22130 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32  .. FROM t1 AS t2
22140 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20  , t1 WHERE t1.a 
22150 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e  = t2.b;.**.** In
22160 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
22170 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ve, the index on
22180 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20   t1(a) has TEXT 
22190 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69  affinity. But si
221a0 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74  nce.** the right
221b0 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68   hand side of th
221c0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
221d0 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73  raint (t2.b) has
221e0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a   NONE affinity,.
221f0 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  ** no conversion
22200 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d   should be attem
22210 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e  pted before usin
22220 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61  g a t2.b value a
22230 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b  s part of.** a k
22240 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65  ey to search the
22250 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68   index. Hence th
22260 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20  e first byte in 
22270 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66  the returned aff
22280 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20  inity.** string 
22290 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20  in this example 
222a0 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  would be set to 
222b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
222c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
222d0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
222e0 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
222f0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
22300 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
22310 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
22320 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
22330 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
22340 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
22350 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57  re coding */.  W
22360 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
22370 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
22380 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69  E clause */.  Bi
22390 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
223a0 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72      /* Which par
223b0 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20  ts of FROM have 
223c0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
223d0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
223e0 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
223f0 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
22400 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
22410 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
22420 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
22430 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
22440 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
22450 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
22460 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
22470 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20  el->plan.nEq;   
22480 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
22490 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
224a0 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
224b0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
224c0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
224d0 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72   /* The vm under
224e0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
224f0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22510 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
22520 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69  ing used for thi
22530 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
22540 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  iCur = pLevel->i
22550 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65  TabCur;   /* The
22560 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
22570 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  able */.  WhereT
22580 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
22590 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
225a0 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
225b0 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  erm */.  int j; 
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
225e0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
225f0 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
22600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
22610 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  e register */.  
22620 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22640 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   Number of regis
22650 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
22660 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
22670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22680 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
22690 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  string to return
226a0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   */..  /* This m
226b0 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61  odule is only ca
226c0 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c  lled on query pl
226d0 61 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  ans that use an 
226e0 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65  index. */.  asse
226f0 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  rt( pLevel->plan
22700 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
22710 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 70 49  _INDEXED );.  pI
22720 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
22730 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20  n.u.pIdx;..  /* 
22740 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
22750 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  any memory cells
22760 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68   we will need th
22770 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d  en allocate them
22780 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65  ..  */.  regBase
22790 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
227a0 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c  + 1;.  nReg = pL
227b0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b  evel->plan.nEq +
227c0 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50   nExtraReg;.  pP
227d0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
227e0 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71  eg;..  zAff = sq
227f0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
22800 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65  arse->db, sqlite
22810 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
22820 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69  r(v, pIdx));.  i
22830 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20  f( !zAff ){.    
22840 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
22850 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
22860 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65  }..  /* Evaluate
22870 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
22880 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
22890 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
228a0 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20  Column>=nEq );. 
228b0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
228c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   j++){.    int r
228d0 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70  1;.    int k = p
228e0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
228f0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  ;.    pTerm = fi
22900 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
22910 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  , k, notReady, p
22920 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
22930 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ags, pIdx);.    
22940 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
22950 72 65 61 6b 3b 0a 20 20 20 20 2f 2a 20 54 68 65  reak;.    /* The
22960 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20   following true 
22970 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68  for indices with
22980 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
22990 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20  ns. .    ** Ex: 
229a0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
229b0 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45  ON t1(a,b,a); SE
229c0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
229d0 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30  HERE a=0 AND b=0
229e0 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  ; */.    testcas
229f0 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  e( (pTerm->wtFla
22a00 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
22a10 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
22a20 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
22a30 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
22a40 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
22a50 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
22a60 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c    r1 = codeEqual
22a70 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
22a80 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72  pTerm, pLevel, r
22a90 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69  egBase+j);.    i
22aa0 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a  f( r1!=regBase+j
22ab0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52   ){.      if( nR
22ac0 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  eg==1 ){.       
22ad0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
22ae0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
22af0 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  egBase);.       
22b00 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20   regBase = r1;. 
22b10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22b30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
22b40 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a  y, r1, regBase+j
22b50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22b60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
22b70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
22b80 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
22b90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
22ba0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
22bb0 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28  WO_IN );.    if(
22bc0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
22bd0 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  or & (WO_ISNULL|
22be0 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20  WO_IN))==0 ){.  
22bf0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
22c00 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
22c10 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73  >pRight;.      s
22c20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
22c30 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
22c40 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70  ht, regBase+j, p
22c50 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
22c60 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20  .      if( zAff 
22c70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
22c80 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
22c90 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41  inity(pRight, zA
22ca0 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  ff[j])==SQLITE_A
22cb0 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  FF_NONE ){.     
22cc0 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
22cd0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
22ce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22cf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22d00 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
22d10 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
22d20 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Aff[j]) ){.     
22d30 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
22d40 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
22d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22d60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  }.    }.  }.  *p
22d70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72  zAff = zAff;.  r
22d80 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d  eturn regBase;.}
22d90 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
22da0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
22db0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22dc0 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72   is a helper for
22dd0 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
22de0 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a  ge() below.**.**
22df0 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20   pStr holds the 
22e00 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65  text of an expre
22e10 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72  ssion that we ar
22e20 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e  e building up on
22e30 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74  e term.** at a t
22e40 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ime.  This routi
22e50 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65  ne adds a new te
22e60 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  rm to the end of
22e70 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
22e80 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65  .** Terms are se
22e90 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73  parated by AND s
22ea0 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20  o add the "AND" 
22eb0 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20  text for second 
22ec0 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  and subsequent.*
22ed0 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f  * terms only..*/
22ee0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
22ef0 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a  lainAppendTerm(.
22f00 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72    StrAccum *pStr
22f10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
22f20 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73   The text expres
22f30 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74  sion being built
22f40 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   */.  int iTerm,
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
22f70 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20  is term.  First 
22f80 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e  is zero */.  con
22f90 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
22fa0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
22fb0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a   of the column *
22fc0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
22fd0 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  zOp             
22fe0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
22ff0 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20  perator */.){.  
23000 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69  if( iTerm ) sqli
23010 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
23020 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c  d(pStr, " AND ",
23030 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   5);.  sqlite3St
23040 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
23050 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b  r, zColumn, -1);
23060 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
23070 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a  umAppend(pStr, z
23080 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  Op, 1);.  sqlite
23090 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
230a0 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d  pStr, "?", 1);.}
230b0 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
230c0 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65   pLevel describe
230d0 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72  s a strategy for
230e0 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20   scanning table 
230f0 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66  pTab. This .** f
23100 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
23110 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
23120 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e  tring buffer con
23130 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69  taining a descri
23140 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ption.** of the 
23150 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20  subset of table 
23160 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20  rows scanned by 
23170 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20  the strategy in 
23180 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a  the form of an.*
23190 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  * SQL expression
231a0 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77  . Or, if all row
231b0 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e  s are scanned, N
231c0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
231d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
231e0 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
231f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
23200 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
23210 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a   a=1 AND b>2;.**
23220 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74  .** is run and t
23230 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
23240 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e   on (a, b), then
23250 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
23260 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69  eturns a.** stri
23270 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  ng similar to:.*
23280 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20  *.**   "a=? AND 
23290 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  b>?".**.** The r
232a0 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20  eturned pointer 
232b0 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79  points to memory
232c0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
232d0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
232e0 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  ..** It is the r
232f0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
23300 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66   the caller to f
23310 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20 77  ree the buffer w
23320 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20  hen it is.** no 
23330 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
23340 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
23350 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e  *explainIndexRan
23360 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ge(sqlite3 *db, 
23370 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
23380 65 6c 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  el, Table *pTab)
23390 7b 0a 20 20 57 68 65 72 65 50 6c 61 6e 20 2a 70  {.  WherePlan *p
233a0 50 6c 61 6e 20 3d 20 26 70 4c 65 76 65 6c 2d 3e  Plan = &pLevel->
233b0 70 6c 61 6e 3b 0a 20 20 49 6e 64 65 78 20 2a 70  plan;.  Index *p
233c0 49 6e 64 65 78 20 3d 20 70 50 6c 61 6e 2d 3e 75  Index = pPlan->u
233d0 2e 70 49 64 78 3b 0a 20 20 69 6e 74 20 6e 45 71  .pIdx;.  int nEq
233e0 20 3d 20 70 50 6c 61 6e 2d 3e 6e 45 71 3b 0a 20   = pPlan->nEq;. 
233f0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c   int i, j;.  Col
23400 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62  umn *aCol = pTab
23410 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61  ->aCol;.  int *a
23420 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
23430 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74  ->aiColumn;.  St
23440 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69  rAccum txt;..  i
23450 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 50  f( nEq==0 && (pP
23460 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  lan->wsFlags & (
23470 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
23480 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
23490 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
234a0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
234b0 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
234c0 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49  &txt, 0, 0, SQLI
234d0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a  TE_MAX_LENGTH);.
234e0 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20    txt.db = db;. 
234f0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
23500 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28  Append(&txt, " (
23510 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ", 2);.  for(i=0
23520 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20  ; i<nEq; i++){. 
23530 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
23540 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 61 43  Term(&txt, i, aC
23550 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  ol[aiColumn[i]].
23560 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d  zName, "=");.  }
23570 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28  ..  j = i;.  if(
23580 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26   pPlan->wsFlags&
23590 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
235a0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
235b0 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f   (j==pIndex->nCo
235c0 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22  lumn ) ? "rowid"
235d0 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
235e0 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
235f0 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
23600 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20  m(&txt, i++, z, 
23610 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ">");.  }.  if( 
23620 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57  pPlan->wsFlags&W
23630 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
23640 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
23650 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  (j==pIndex->nCol
23660 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20  umn ) ? "rowid" 
23670 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
23680 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
23690 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
236a0 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22  (&txt, i, z, "<"
236b0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
236c0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
236d0 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  txt, ")", 1);.  
236e0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74  return sqlite3St
236f0 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78  rAccumFinish(&tx
23700 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
23710 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
23720 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72  no-op unless cur
23730 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
23740 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  g an EXPLAIN QUE
23750 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61  RY PLAN.** comma
23760 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  nd. If the query
23770 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20   being compiled 
23780 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  is an EXPLAIN QU
23790 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67  ERY PLAN, a sing
237a0 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  le.** record is 
237b0 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74  added to the out
237c0 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  put to describe 
237d0 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73  the table scan s
237e0 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70  trategy in .** p
237f0 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  Level..*/.static
23800 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65   void explainOne
23810 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Scan(.  Parse *p
23820 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
23830 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
23840 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
23850 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23870 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73   Table list this
23880 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20   loop refers to 
23890 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
238a0 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  *pLevel,        
238b0 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20       /* Scan to 
238c0 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e  write OP_Explain
238d0 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20   opcode for */. 
238e0 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23900 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c   /* Value for "l
23910 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel" column of 
23920 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
23930 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
23940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
23950 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20  alue for "from" 
23960 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
23970 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
23980 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
23990 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
239a0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
239b0 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
239c0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
239d0 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
239e0 20 20 20 75 33 32 20 66 6c 61 67 73 20 3d 20 70     u32 flags = p
239f0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
23a00 61 67 73 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ags;.    struct 
23a10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
23a20 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
23a30 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
23a40 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ];.    Vdbe *v =
23a50 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
23a60 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67       /* VM being
23a70 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a   constructed */.
23a80 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
23a90 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
23aa0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
23ab0 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  ndle */.    char
23ac0 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20   *zMsg;         
23ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
23ae0 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20  t to add to EQP 
23af0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 73 71  output */.    sq
23b00 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 52 6f 77  lite3_int64 nRow
23b10 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ;           /* E
23b20 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
23b30 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  f rows visited b
23b40 79 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 69 6e  y scan */.    in
23b50 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  t iId = pParse->
23b60 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53  iSelectId;  /* S
23b70 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d  elect id (left-m
23b80 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  ost output colum
23b90 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  n) */.    int is
23ba0 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20  Search;         
23bb0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
23bc0 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61  for a SEARCH. Fa
23bd0 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f  lse for SCAN. */
23be0 0a 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ..    if( (flags
23bf0 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
23c00 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
23c10 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
23c20 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  NLY) ) return;..
23c30 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28      isSearch = (
23c40 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
23c50 3e 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  >0).            
23c60 20 7c 7c 20 28 66 6c 61 67 73 26 28 57 48 45 52   || (flags&(WHER
23c70 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
23c80 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30  E_TOP_LIMIT))!=0
23c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
23ca0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48   (wctrlFlags&(WH
23cb0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c  ERE_ORDERBY_MIN|
23cc0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
23cd0 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d  X));..    zMsg =
23ce0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
23cf0 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72  db, "%s", isSear
23d00 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41  ch?"SEARCH":"SCA
23d10 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
23d20 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
23d30 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
23d40 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
23d50 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45  zMsg, "%s SUBQUE
23d60 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74  RY %d", zMsg,pIt
23d70 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a  em->iSelectId);.
23d80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23d90 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
23da0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
23db0 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c  , "%s TABLE %s",
23dc0 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e   zMsg, pItem->zN
23dd0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
23de0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
23df0 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  as ){.      zMsg
23e00 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
23e10 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
23e20 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
23e30 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
23e40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
23e50 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
23e60 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  XED)!=0 ){.     
23e70 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
23e80 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
23e90 65 28 64 62 2c 20 70 4c 65 76 65 6c 2c 20 70 49  e(db, pLevel, pI
23ea0 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
23eb0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
23ec0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
23ed0 67 2c 20 22 25 73 20 55 53 49 4e 47 20 25 73 25  g, "%s USING %s%
23ee0 73 49 4e 44 45 58 25 73 25 73 25 73 22 2c 20 7a  sINDEX%s%s%s", z
23ef0 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Msg, .          
23f00 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
23f10 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 41 55 54  TEMP_INDEX)?"AUT
23f20 4f 4d 41 54 49 43 20 22 3a 22 22 29 2c 0a 20 20  OMATIC ":""),.  
23f30 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
23f40 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
23f50 29 3f 22 43 4f 56 45 52 49 4e 47 20 22 3a 22 22  )?"COVERING ":""
23f60 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  ),.          ((f
23f70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
23f80 50 5f 49 4e 44 45 58 29 3f 22 22 3a 22 20 22 29  P_INDEX)?"":" ")
23f90 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c  ,.          ((fl
23fa0 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
23fb0 5f 49 4e 44 45 58 29 3f 22 22 3a 20 70 4c 65 76  _INDEX)?"": pLev
23fc0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  el->plan.u.pIdx-
23fd0 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  >zName),.       
23fe0 20 20 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20     zWhere.      
23ff0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24000 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72  DbFree(db, zWher
24010 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
24020 28 20 66 6c 61 67 73 20 26 20 28 57 48 45 52 45  ( flags & (WHERE
24030 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
24040 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
24050 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
24060 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
24070 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47   zMsg, "%s USING
24080 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
24090 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20   KEY", zMsg);.. 
240a0 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 57       if( flags&W
240b0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
240c0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
240d0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
240e0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
240f0 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid=?)", zMsg);
24100 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
24110 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f   (flags&WHERE_BO
24120 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45  TH_LIMIT)==WHERE
24130 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20  _BOTH_LIMIT ){. 
24140 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
24150 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
24160 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
24170 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f  id>? AND rowid<?
24180 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
24190 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
241a0 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
241b0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
241c0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
241d0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
241e0 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73   (rowid>?)", zMs
241f0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
24200 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
24210 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
24220 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
24230 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
24240 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
24250 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
24260 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
24270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
24280 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
24290 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
242a0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
242b0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
242c0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
242d0 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d  info *pVtabIdx =
242e0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
242f0 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20 20 20  pVtabIdx;.      
24300 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
24310 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
24320 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42   "%s VIRTUAL TAB
24330 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
24340 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
24350 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
24360 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61 62  x->idxNum, pVtab
24370 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  Idx->idxStr);.  
24380 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
24390 66 28 20 77 63 74 72 6c 46 6c 61 67 73 26 28 57  f( wctrlFlags&(W
243a0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
243b0 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  |WHERE_ORDERBY_M
243c0 41 58 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  AX) ){.      tes
243d0 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
243e0 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
243f0 59 5f 4d 49 4e 20 29 3b 0a 20 20 20 20 20 20 6e  Y_MIN );.      n
24400 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Row = 1;.    }el
24410 73 65 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d  se{.      nRow =
24420 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
24430 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f  pLevel->plan.nRo
24440 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 73  w;.    }.    zMs
24450 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
24460 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
24470 73 20 28 7e 25 6c 6c 64 20 72 6f 77 73 29 22 2c  s (~%lld rows)",
24480 20 7a 4d 73 67 2c 20 6e 52 6f 77 29 3b 0a 20 20   zMsg, nRow);.  
24490 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
244a0 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
244b0 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20  n, iId, iLevel, 
244c0 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f  iFrom, zMsg, P4_
244d0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
244e0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
244f0 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c  xplainOneScan(u,
24500 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
24510 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
24520 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a  _EXPLAIN */.../*
24530 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
24540 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
24550 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68  of the iLevel-th
24560 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45   loop in the WHE
24570 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70  RE clause.** imp
24580 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63  lementation desc
24590 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e  ribed by pWInfo.
245a0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
245b0 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  sk codeOneLoopSt
245c0 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  art(.  WhereInfo
245d0 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
245e0 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
245f0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
24600 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
24610 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
24620 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
24630 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
24640 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
24650 65 64 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ed */.  u16 wctr
24660 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 2f 2a 20  lFlags,      /* 
24670 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
24680 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
24690 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
246a0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
246b0 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69  Ready     /* Whi
246c0 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75  ch tables are cu
246d0 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
246e0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c  e */.){.  int j,
246f0 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   k;            /
24700 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
24710 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
24720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24730 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
24740 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
24750 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20  int addrNxt;    
24760 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
24770 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75   jump to continu
24780 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
24790 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  IN case */.  int
247a0 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20   omitTable;     
247b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
247c0 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  use the index on
247d0 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ly */.  int bRev
247e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
247f0 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20  True if we need 
24800 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
24810 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68  se order */.  Wh
24820 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
24830 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20  ;  /* The where 
24840 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65  level to be code
24850 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
24860 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44  se *pWC;    /* D
24870 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
24880 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45  the entire WHERE
24890 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
248a0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248c0 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  A WHERE clause t
248d0 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  erm */.  Parse *
248e0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
248f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
24900 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24910 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
24940 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73   stmt under cons
24950 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  tructions */.  s
24960 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24970 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
24980 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
24990 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  rm being coded *
249a0 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b  /.  int addrBrk;
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249c0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
249d0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
249e0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
249f0 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20  nt addrCont;    
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a10 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
24a20 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
24a30 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
24a40 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20   iRowidReg = 0; 
24a50 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
24a60 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69  is stored in thi
24a70 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e  s register, if n
24a80 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ot zero */.  int
24a90 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30   iReleaseReg = 0
24aa0 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72  ;      /* Temp r
24ab0 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
24ac0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
24ad0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
24ae0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
24af0 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
24b00 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 70 57 49  dbe;.  pWC = pWI
24b10 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76  nfo->pWC;.  pLev
24b20 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
24b30 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49  iLevel];.  pTabI
24b40 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  tem = &pWInfo->p
24b50 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
24b60 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75  l->iFrom];.  iCu
24b70 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
24b80 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20  ursor;.  bRev = 
24b90 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
24ba0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45  Flags & WHERE_RE
24bb0 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69  VERSE)!=0;.  omi
24bc0 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c  tTable = (pLevel
24bd0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
24be0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
24bf0 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
24c00 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
24c10 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
24c20 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 43 72  LE)==0;..  /* Cr
24c30 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20  eate labels for 
24c40 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20  the "break" and 
24c50 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72  "continue" instr
24c60 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72  uctions.  ** for
24c70 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
24c80 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72  p.  Jump to addr
24c90 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  Brk to break out
24ca0 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a   of a loop..  **
24cb0 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f   Jump to cont to
24cc0 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   go immediately 
24cd0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
24ce0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
24cf0 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a  * loop..  **.  *
24d00 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20  * When there is 
24d10 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  an IN operator, 
24d20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22  we also have a "
24d30 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74  addrNxt" label t
24d40 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74  hat.  ** means t
24d50 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
24d60 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75  the next IN valu
24d70 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20  e combination.  
24d80 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20  When.  ** there 
24d90 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74  are no IN operat
24da0 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  ors in the const
24db0 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64  raints, the "add
24dc0 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a  rNxt" label.  **
24dd0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
24de0 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a  "addrBrk"..  */.
24df0 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76    addrBrk = pLev
24e00 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c  el->addrBrk = pL
24e10 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
24e20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
24e30 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43  abel(v);.  addrC
24e40 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  ont = pLevel->ad
24e50 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
24e60 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
24e70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
24e80 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
24e90 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  le of a LEFT OUT
24ea0 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74  ER JOIN, allocat
24eb0 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69  e and.  ** initi
24ec0 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63  alize a memory c
24ed0 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73  ell that records
24ee0 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d   if this table m
24ef0 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20  atches any.  ** 
24f00 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20  row of the left 
24f10 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
24f20 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  n..  */.  if( pL
24f30 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26  evel->iFrom>0 &&
24f40 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f   (pTabItem[0].jo
24f50 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
24f60 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76  )!=0 ){.    pLev
24f70 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20  el->iLeftJoin = 
24f80 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
24f90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24fa0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
24fb0 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 0, pLevel->
24fc0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
24fd0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
24fe0 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20  "init LEFT JOIN 
24ff0 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29  no-match flag"))
25000 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
25010 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
25020 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28  ALTABLE.  if(  (
25030 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
25040 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
25050 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
25060 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20  .    /* Case 0: 
25070 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   The table is a 
25080 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20  virtual-table.  
25090 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20  Use the VFilter 
250a0 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a  and VNext.    **
250b0 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63            to acc
250c0 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20  ess the data..  
250d0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65    */.    int iRe
250e0 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65  g;   /* P3 Value
250f0 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20   for OP_VFilter 
25100 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
25110 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62  ndex_info *pVtab
25120 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
25130 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20  an.u.pVtabIdx;. 
25140 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
25150 6e 74 20 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e  nt = pVtabIdx->n
25160 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
25170 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
25180 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
25190 75 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a  usage *aUsage =.
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251d0 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74  pVtabIdx->aConst
251e0 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20  raintUsage;.    
251f0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
25200 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
25210 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69  raint *aConstrai
25220 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  nt =.           
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61       pVtabIdx->a
25260 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20  Constraint;..   
25270 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25280 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
25290 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
252a0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
252b0 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  arse, nConstrain
252c0 74 2b 32 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  t+2);.    for(j=
252d0 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e  1; j<=nConstrain
252e0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  t; j++){.      f
252f0 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74  or(k=0; k<nConst
25300 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20  raint; k++){.   
25310 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b       if( aUsage[
25320 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20  k].argvIndex==j 
25330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
25340 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72   iTerm = aConstr
25350 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66  aint[k].iTermOff
25360 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  set;.          s
25370 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
25380 50 61 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54  Parse, pWC->a[iT
25390 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67  erm].pExpr->pRig
253a0 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20  ht, iReg+j+1);. 
253b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
253c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
253d0 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e  }.      if( k==n
253e0 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65  Constraint ) bre
253f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ak;.    }.    sq
25400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25410 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
25420 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c  VtabIdx->idxNum,
25430 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69   iReg);.    sqli
25440 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25450 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31   OP_Integer, j-1
25460 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
25470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
25480 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
25490 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 69  iCur, addrBrk, i
254a0 52 65 67 2c 20 70 56 74 61 62 49 64 78 2d 3e 69  Reg, pVtabIdx->i
254b0 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74               pVt
254d0 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65  abIdx->needToFre
254e0 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52  eIdxStr ? P4_MPR
254f0 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43  INTF : P4_STATIC
25500 29 3b 0a 20 20 20 20 70 56 74 61 62 49 64 78 2d  );.    pVtabIdx-
25510 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
25520 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  r = 0;.    for(j
25530 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; j<nConstrain
25540 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  t; j++){.      i
25550 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69  f( aUsage[j].omi
25560 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
25570 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72   iTerm = aConstr
25580 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  aint[j].iTermOff
25590 73 65 74 3b 0a 20 20 20 20 20 20 20 20 64 69 73  set;.        dis
255a0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
255b0 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29   &pWC->a[iTerm])
255c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
255d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
255e0 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70   OP_VNext;.    p
255f0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
25600 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
25610 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
25620 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
25630 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
25640 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
25650 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61  , iReg, nConstra
25660 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  int+2);.    sqli
25670 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
25680 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65  pParse, 1);.  }e
25690 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
256a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
256b0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28  LTABLE */..  if(
256c0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
256d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  Flags & WHERE_RO
256e0 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a  WID_EQ ){.    /*
256f0 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e   Case 1:  We can
25700 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
25710 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
25720 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
25730 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69            equali
25740 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
25750 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
25760 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a  field.  Or.    *
25770 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65  *          we re
25780 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65  ference multiple
25790 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72   rows using a "r
257a0 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20  owid IN (...)". 
257b0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
257c0 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f  onstruct..    */
257d0 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67  .    iReleaseReg
257e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
257f0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
25800 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
25810 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
25820 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
25830 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20  Q|WO_IN, 0);.   
25840 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
25850 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
25860 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
25870 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
25880 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
25890 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61  r==iCur );.    a
258a0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
258b0 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
258c0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
258d0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
258e0 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
258f0 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
25900 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f    iRowidReg = co
25910 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
25920 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
25930 65 76 65 6c 2c 20 69 52 65 6c 65 61 73 65 52 65  evel, iReleaseRe
25940 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  g);.    addrNxt 
25950 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
25960 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
25970 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
25980 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64  ustBeInt, iRowid
25990 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  Reg, addrNxt);. 
259a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
259b0 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
259c0 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72  ists, iCur, addr
259d0 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Nxt, iRowidReg);
259e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
259f0 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
25a00 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
25a10 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62  widReg);.    Vdb
25a20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
25a30 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  "));.    pLevel-
25a40 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
25a50 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
25a60 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
25a70 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  & WHERE_ROWID_RA
25a80 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  NGE ){.    /* Ca
25a90 73 65 20 32 3a 20 20 57 65 20 68 61 76 65 20 61  se 2:  We have a
25aa0 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d  n inequality com
25ab0 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
25ac0 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
25ad0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
25ae0 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  testOp = OP_Noop
25af0 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b  ;.    int start;
25b00 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56  .    int memEndV
25b10 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68  alue = 0;.    Wh
25b20 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c  ereTerm *pStart,
25b30 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73   *pEnd;..    ass
25b40 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
25b50 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20  0 );.    pStart 
25b60 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
25b70 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
25b80 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
25b90 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20   0);.    pEnd = 
25ba0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
25bb0 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
25bc0 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30  , WO_LT|WO_LE, 0
25bd0 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20  );.    if( bRev 
25be0 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ){.      pTerm =
25bf0 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70   pStart;.      p
25c00 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
25c10 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
25c20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
25c30 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
25c40 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
25c50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
25c60 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66  ression that def
25c70 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62  ines the start b
25c80 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
25c90 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20  t r1, rTemp;    
25ca0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
25cb0 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
25cc0 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20   start boundary 
25cd0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
25ce0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
25cf0 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63  ant maps TK_xx c
25d00 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73  odes into corres
25d10 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  ponding .      *
25d20 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20  * seek opcodes. 
25d30 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61   It depends on a
25d40 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
25d50 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20  ring of TK_xx.  
25d60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
25d70 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20  st u8 aMoveOp[] 
25d80 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f  = {.           /
25d90 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53  * TK_GT */  OP_S
25da0 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20  eekGt,.         
25db0 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f    /* TK_LE */  O
25dc0 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20  P_SeekLe,.      
25dd0 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f       /* TK_LT */
25de0 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20    OP_SeekLt,.   
25df0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45          /* TK_GE
25e00 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20   */  OP_SeekGe. 
25e10 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
25e20 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f  sert( TK_LE==TK_
25e30 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+1 );      /* 
25e40 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  Make sure the or
25e50 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20  dering.. */.    
25e60 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
25e70 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20  =TK_GT+2 );     
25e80 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20   /*  ... of the 
25e90 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20  TK_xx values... 
25ea0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
25eb0 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20   TK_GE==TK_GT+3 
25ec0 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
25ed0 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a  is correcct. */.
25ee0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25ef0 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73   pStart->wtFlags
25f00 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
25f10 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
25f20 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20  5-11662 */.     
25f30 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45   pX = pStart->pE
25f40 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
25f50 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
25f60 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
25f70 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
25f80 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  ur );.      r1 =
25f90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25fa0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d  Temp(pParse, pX-
25fb0 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29  >pRight, &rTemp)
25fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25fd0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f  dbeAddOp3(v, aMo
25fe0 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47  veOp[pX->op-TK_G
25ff0 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  T], iCur, addrBr
26000 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  k, r1);.      Vd
26010 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
26020 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  k"));.      sqli
26030 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
26040 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
26050 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  e, r1, 1);.     
26060 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
26070 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
26080 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73  Temp);.      dis
26090 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
260a0 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65   pStart);.    }e
260b0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
260c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
260d0 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
260e0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
260f0 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
26100 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  }.    if( pEnd )
26110 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
26120 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e  ;.      pX = pEn
26130 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
26140 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
26150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26160 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  End->leftCursor=
26170 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74  =iCur );.      t
26180 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77  estcase( pEnd->w
26190 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
261a0 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
261b0 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
261c0 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c  .      memEndVal
261d0 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ue = ++pParse->n
261e0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
261f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
26200 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d  e, pX->pRight, m
26210 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20  emEndValue);.   
26220 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54     if( pX->op==T
26230 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  K_LT || pX->op==
26240 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20  TK_GT ){.       
26250 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
26260 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a   OP_Le : OP_Ge;.
26270 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26280 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
26290 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f  ev ? OP_Lt : OP_
262a0 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Gt;.      }.    
262b0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
262c0 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20  evel, pEnd);.   
262d0 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73   }.    start = s
262e0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
262f0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c  tAddr(v);.    pL
26300 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20  evel->op = bRev 
26310 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
26320 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
26330 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
26340 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
26350 72 74 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  rt;.    if( pSta
26360 72 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30  rt==0 && pEnd==0
26370 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
26380 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
26390 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
263a0 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73  N_STEP;.    }els
263b0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
263c0 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
263d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
263e0 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
263f0 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
26400 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
26410 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
26420 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
26430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26440 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
26450 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  d, iCur, iRowidR
26460 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
26470 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
26480 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
26490 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
264a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
264b0 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70  AddOp3(v, testOp
264c0 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61  , memEndValue, a
264d0 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65  ddrBrk, iRowidRe
264e0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
264f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
26500 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
26510 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  RIC | SQLITE_JUM
26520 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  PIFNULL);.    }.
26530 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
26540 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
26550 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
26560 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c  _RANGE|WHERE_COL
26570 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f  UMN_EQ) ){.    /
26580 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e  * Case 3: A scan
26590 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e   using an index.
265a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
265b0 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45         The WHERE
265c0 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74   clause may cont
265d0 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ain zero or more
265e0 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a   equality .    *
265f0 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20  *         terms 
26600 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70  ("==" or "IN" op
26610 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65  erators) that re
26620 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20  fer to the N.   
26630 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74   **         left
26640 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  -most columns of
26650 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d   the index. It m
26660 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a  ay also contain.
26670 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
26680 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
26690 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20  aints (>, <, >= 
266a0 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e  or <=) on the in
266b0 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dexed.    **    
266c0 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
266d0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
266e0 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
266f0 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
26700 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
26710 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
26720 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
26730 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
26740 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20  t must.    **   
26750 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d        use the "=
26760 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72  =" and "IN" oper
26770 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
26780 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20  le, if the .    
26790 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
267a0 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
267b0 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
267c0 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
267d0 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ll .    **      
267e0 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20     optimized:.  
267f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
26800 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a         x=5.    *
26810 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
26820 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a   AND y=10.    **
26830 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
26840 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
26850 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
26860 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a  ND y>5 AND y<10.
26870 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
26880 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e    x=5 AND y=5 AN
26890 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20  D z<=10.    **. 
268a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
268b0 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74  e z<10 term of t
268c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e  he following can
268d0 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c  not be used, onl
268e0 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  y.    **        
268f0 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20   the x=5 term:. 
26900 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
26910 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
26920 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  z<10.    **.    
26930 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79  **         N may
26940 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72   be zero if ther
26950 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
26960 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
26970 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20    **         If 
26980 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65  there are no ine
26990 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
269a0 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61  nts, then N is a
269b0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
269c0 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
269d0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
269e0 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
269f0 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
26a00 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
26a10 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20   clause.    **  
26a20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
26a30 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
26a40 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
26a50 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
26a60 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
26a70 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
26a80 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
26a90 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
26aa0 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74  .    */  .    st
26ab0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
26ac0 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
26ad0 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20     0,.      0,. 
26ae0 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20       OP_Rewind, 
26af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
26b00 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
26b10 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
26b20 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  &  !bRev) */.   
26b30 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20     OP_Last,     
26b40 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21          /* 3: (!
26b50 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
26b60 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
26b70 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
26b80 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20   OP_SeekGt,     
26b90 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
26ba0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
26bb0 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
26bc0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
26bd0 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20  P_SeekLt,       
26be0 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
26bf0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
26c00 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
26c10 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
26c20 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20  SeekGe,         
26c30 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63    /* 6: (start_c
26c40 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
26c50 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
26c60 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
26c70 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20  ekLe            
26c80 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
26c90 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
26ca0 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
26cb0 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74  */.    };.    st
26cc0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45  atic const u8 aE
26cd0 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndOp[] = {.     
26ce0 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
26cf0 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e        /* 0: (!en
26d00 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a  d_constraints) *
26d10 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45  /.      OP_IdxGE
26d20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26d30 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  1: (end_constrai
26d40 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f  nts && !bRev) */
26d50 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20  .      OP_IdxLT 
26d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
26d70 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
26d80 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20  ts && bRev) */. 
26d90 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45     };.    int nE
26da0 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  q = pLevel->plan
26db0 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  .nEq;  /* Number
26dc0 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72   of == or IN ter
26dd0 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ms */.    int is
26de0 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20  MinQuery = 0;   
26df0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
26e00 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  s is an optimize
26e10 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e  d SELECT min(x).
26e20 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  . */.    int reg
26e30 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
26e40 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
26e50 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
26e60 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73  onstraint values
26e70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20   */.    int r1; 
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e90 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67       /* Temp reg
26ea0 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65  ister */.    Whe
26eb0 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74  reTerm *pRangeSt
26ec0 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65  art = 0;  /* Ine
26ed0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
26ee0 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72  nt at range star
26ef0 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  t */.    WhereTe
26f00 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20  rm *pRangeEnd = 
26f10 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c  0;    /* Inequal
26f20 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
26f30 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20  t range end */. 
26f40 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20     int startEq; 
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65  /* True if range
26f70 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20   start uses ==, 
26f80 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
26f90 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20  int endEq;      
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26fb0 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e  True if range en
26fc0 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72  d uses ==, >= or
26fd0 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73   <= */.    int s
26fe0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
26ff0 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
27000 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e   of range is con
27010 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20  strained */.    
27020 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
27030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27040 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72  Number of constr
27050 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20  aint terms */.  
27060 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
27070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27080 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77  * The index we w
27090 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a  ill be using */.
270a0 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b      int iIdxCur;
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270c0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
270d0 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  sor for the inde
270e0 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78  x */.    int nEx
270f0 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20  traReg = 0;     
27100 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27110 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
27120 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20  rs needed */.   
27130 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
27140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27150 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63   Instruction opc
27160 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ode */.    char 
27170 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20  *zStartAff;     
27180 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
27190 69 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66  ity for start of
271a0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
271b0 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  t */.    char *z
271c0 45 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20 20  EndAff;         
271d0 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
271e0 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e  y for end of ran
271f0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
27200 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65  ..    pIdx = pLe
27210 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
27220 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
27230 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
27240 0a 20 20 20 20 6b 20 3d 20 28 6e 45 71 3d 3d 70  .    k = (nEq==p
27250 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d  Idx->nColumn ? -
27260 31 20 3a 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  1 : pIdx->aiColu
27270 6d 6e 5b 6e 45 71 5d 29 3b 0a 0a 20 20 20 20 2f  mn[nEq]);..    /
27280 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73  * If this loop s
27290 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20  atisfies a sort 
272a0 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29  order (pOrderBy)
272b0 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20   request that . 
272c0 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64     ** was passed
272d0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
272e0 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  n to implement a
272f0 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20   "SELECT min(x) 
27300 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65  ..." .    ** que
27310 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ry, then the cal
27320 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c  ler will only al
27330 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20  low the loop to 
27340 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61  run for.    ** a
27350 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f   single iteratio
27360 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  n. This means th
27370 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  at the first row
27380 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a   returned.    **
27390 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
273a0 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74   a NULL value st
273b0 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20  ored in 'x'. If 
273c0 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20  column 'x' is.  
273d0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f    ** the first o
273e0 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71  ne after the nEq
273f0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
27400 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  aints in the ind
27410 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ex,.    ** this 
27420 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70  requires some sp
27430 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
27440 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
27450 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
27460 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30  _ORDERBY_MIN)!=0
27470 0a 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c  .     && (pLevel
27480 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57  ->plan.wsFlags&W
27490 48 45 52 45 5f 4f 52 44 45 52 45 44 29 0a 20 20  HERE_ORDERED).  
274a0 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f     && (pIdx->nCo
274b0 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b  lumn>nEq).    ){
274c0 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
274d0 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ( pOrderBy->nExp
274e0 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20  r==1 ); */.     
274f0 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
27500 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  erBy->a[0].pExpr
27510 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
27520 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29  >aiColumn[nEq] )
27530 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e  ; */.      isMin
27540 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20  Query = 1;.     
27550 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
27560 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
27570 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74  nd any inequalit
27580 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  y constraint ter
27590 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  ms for the start
275a0 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a   and end .    **
275b0 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a   of the range. .
275c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
275d0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
275e0 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
275f0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
27600 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54  RangeEnd = findT
27610 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
27620 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f  , notReady, (WO_
27630 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29  LT|WO_LE), pIdx)
27640 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
27650 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
27660 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
27670 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
27680 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
27690 20 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74       pRangeStart
276a0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
276b0 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
276c0 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  dy, (WO_GT|WO_GE
276d0 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  ), pIdx);.      
276e0 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
276f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
27700 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
27710 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
27720 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
27730 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a  g == or IN.    *
27740 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
27750 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
27760 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61  terms in an arra
27770 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  y of registers. 
27780 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
27790 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a  t regBase..    *
277a0 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  /.    regBase = 
277b0 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
277c0 65 72 6d 73 28 0a 20 20 20 20 20 20 20 20 70 50  erms(.        pP
277d0 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57  arse, pLevel, pW
277e0 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78  C, notReady, nEx
277f0 74 72 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41  traReg, &zStartA
27800 66 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45  ff.    );.    zE
27810 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44  ndAff = sqlite3D
27820 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
27830 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
27840 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
27850 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a  evel->addrNxt;..
27860 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
27870 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
27880 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
27890 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
278a0 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66  x, or.    ** a f
278b0 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61  orward order sca
278c0 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  n on a descendin
278d0 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68  g index, interch
278e0 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  ange the .    **
278f0 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
27900 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
27910 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
27920 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27930 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c   (nEq<pIdx->nCol
27940 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49  umn && bRev==(pI
27950 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
27960 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
27970 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52  SC)).     || (bR
27980 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c  ev && pIdx->nCol
27990 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b  umn==nEq).    ){
279a0 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72  .      SWAP(Wher
279b0 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45  eTerm *, pRangeE
279c0 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  nd, pRangeStart)
279d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
279e0 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
279f0 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
27a00 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
27a10 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_LE );.    test
27a20 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
27a30 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
27a40 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27a50 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _GE );.    testc
27a60 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
27a70 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
27a80 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29  erator & WO_LE )
27a90 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
27aa0 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61  pRangeEnd && pRa
27ab0 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
27ac0 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  r & WO_GE );.   
27ad0 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e   startEq = !pRan
27ae0 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67  geStart || pRang
27af0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
27b00 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
27b10 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20  );.    endEq =  
27b20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70   !pRangeEnd || p
27b30 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
27b40 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
27b50 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63  GE);.    start_c
27b60 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61  onstraints = pRa
27b70 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e  ngeStart || nEq>
27b80 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  0;..    /* Seek 
27b90 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
27ba0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
27bb0 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
27bc0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
27bd0 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
27be0 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20  angeStart ){.   
27bf0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
27c00 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70  = pRangeStart->p
27c10 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
27c20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27c30 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
27c40 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
27c50 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
27c60 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
27c70 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
27c80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
27c90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
27ca0 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
27cb0 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
27cc0 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
27cd0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  }.      if( zSta
27ce0 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  rtAff ){.       
27cf0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
27d00 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
27d10 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
27d20 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
27d30 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
27d40 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
27d50 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
27d60 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
27d70 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
27d80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
27d90 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
27da0 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
27db0 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
27dc0 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
27dd0 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
27de0 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
27df0 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
27e00 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
27e10 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
27e20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
27e30 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
27e40 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
27e50 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ge(pRight, zStar
27e60 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  tAff[nEq]) ){.  
27e70 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
27e80 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
27e90 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
27ea0 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
27eb0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
27ec0 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
27ed0 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e( pRangeStart->
27ee0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
27ef0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
27f00 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
27f10 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
27f20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
27f30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27f40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
27f50 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
27f60 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
27f70 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
27f80 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
27f90 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
27fa0 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
27fb0 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
27fc0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
27fd0 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
27fe0 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
27ff0 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
28000 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
28010 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
28020 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
28030 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
28040 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
28050 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
28060 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
28070 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
28080 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
28090 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
280a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
280b0 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20  =OP_SeekGe );.  
280c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
280d0 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
280e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
280f0 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20  P_SeekLt );.    
28100 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28110 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
28120 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
28130 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
28140 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  nt);..    /* Loa
28150 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
28160 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
28170 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
28180 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
28190 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
281a0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
281b0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
281c0 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
281d0 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
281e0 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
281f0 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
28200 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
28210 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
28220 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
28230 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
28240 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28250 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
28260 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
28270 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
28280 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
28290 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
282a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
282b0 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
282c0 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
282d0 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
282e0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
282f0 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29     if( zEndAff )
28300 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
28310 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
28320 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e  nity(pRight, zEn
28330 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  dAff[nEq])==SQLI
28340 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
28350 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
28360 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
28370 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
28380 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
28390 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
283a0 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
283b0 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
283c0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
283d0 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
283e0 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
283f0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
28400 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
28410 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20   zEndAff[nEq] = 
28420 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
28430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28440 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
28450 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
28460 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
28470 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b  zEndAff[nEq]) ){
28480 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
28490 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
284a0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
284b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
284c0 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
284d0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
284e0 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a  egBase, nEq+1, z
284f0 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e  EndAff);.      n
28500 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
28510 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
28520 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
28530 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
28540 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
28550 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d  5-11662 */.    }
28560 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
28570 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
28580 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73  StartAff);.    s
28590 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
285a0 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66  rse->db, zEndAff
285b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
285c0 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
285d0 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
285e0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
285f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
28600 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
28610 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
28620 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
28630 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
28640 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f  /.    op = aEndO
28650 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20  p[(pRangeEnd || 
28660 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76  nEq) * (1 + bRev
28670 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  )];.    testcase
28680 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b  ( op==OP_Noop );
28690 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
286a0 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  p==OP_IdxGE );. 
286b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
286c0 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
286d0 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70   if( op!=OP_Noop
286e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
286f0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
28700 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
28710 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
28720 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
28730 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28740 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45  ChangeP5(v, endE
28750 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20  q!=bRev ?1:0);. 
28760 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
28770 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
28780 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
28790 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
287a0 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
287b0 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
287c0 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75  n that the inequ
287d0 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20  ality contrains 
287e0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
287f0 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75   ** If it is, ju
28800 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
28810 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
28820 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
28830 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
28840 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
28850 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
28860 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
28870 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
28880 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73  LIMIT );.    tes
28890 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
288a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
288b0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b  ERE_TOP_LIMIT );
288c0 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
288d0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
288e0 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
288f0 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
28900 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  T))!=0 ){.      
28910 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28920 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
28930 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31  iIdxCur, nEq, r1
28940 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28950 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28960 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64  _IsNull, r1, add
28970 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rCont);.    }.  
28980 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
28990 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
289a0 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  r1);..    /* See
289b0 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
289c0 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
289d0 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  */.    disableTe
289e0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
289f0 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73  eStart);.    dis
28a00 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
28a10 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20   pRangeEnd);.   
28a20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
28a30 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
28a40 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
28a50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
28a60 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
28a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28a80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
28a90 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69  owid, iIdxCur, i
28aa0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
28ab0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
28ac0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
28ad0 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
28ae0 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
28af0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28b00 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69  OP_Seek, iCur, i
28b10 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44  RowidReg);  /* D
28b20 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a  eferred seek */.
28b30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
28b40 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
28b50 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
28b60 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
28b70 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a   Disable .    **
28b80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
28b90 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61  rms made redunda
28ba0 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  nt by the index 
28bb0 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20  range scan..    
28bc0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
28bd0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
28be0 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 29  & WHERE_UNIQUE )
28bf0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
28c00 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
28c10 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
28c20 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
28c30 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a  ->op = OP_Prev;.
28c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28c50 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
28c60 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _Next;.    }.   
28c70 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49   pLevel->p1 = iI
28c80 64 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70  dxCur;.    if( p
28c90 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
28ca0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 56 45  ags & WHERE_COVE
28cb0 52 5f 53 43 41 4e 20 29 7b 0a 20 20 20 20 20 20  R_SCAN ){.      
28cc0 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
28cd0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
28ce0 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
28cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
28d00 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
28d10 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  5==0 );.    }.  
28d20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
28d30 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
28d40 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
28d50 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
28d60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
28d70 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
28d80 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72   Case 4:  Two or
28d90 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
28da0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
28db0 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
28dc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
28dd0 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
28de0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
28df0 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
28e00 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
28e10 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
28e20 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
28e30 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
28e40 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
28e50 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
28e60 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
28e70 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
28e80 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
28e90 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
28ea0 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
28eb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
28ec0 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
28ed0 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
28ee0 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
28ef0 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
28f00 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
28f10 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65   loop looks like
28f20 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
28f30 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
28f40 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
28f50 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
28f60 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
28f70 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eg 1.    **.    
28f80 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  ** Then, for eac
28f90 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20  h indexed term, 
28fa0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54  the following. T
28fb0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  he arguments to.
28fc0 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73      ** RowSetTes
28fd0 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20  t are such that 
28fe0 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
28ff0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
29000 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20  inserted.    ** 
29010 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e  into the RowSet.
29020 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
29030 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72  y present, contr
29040 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20  ol skips the.   
29050 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65   ** Gosub opcode
29060 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69   and jumps strai
29070 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20  ght to the code 
29080 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65  generated by Whe
29090 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a  reEnd()..    **.
290a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
290b0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
290c0 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20  <term>).    **  
290d0 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65          RowSetTe
290e0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
290f0 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77      # Insert row
29100 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20  id into rowset. 
29110 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
29120 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20  osub      2 A.  
29130 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
29140 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20  te3WhereEnd().  
29150 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c    **.    ** Foll
29160 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c  owing the above,
29170 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61   code to termina
29180 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62  te the loop. Lab
29190 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74  el A, the target
291a0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47  .    ** of the G
291b0 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70  osub above, jump
291c0 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  s to the instruc
291d0 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72  tion right after
291e0 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a   the Goto..    *
291f0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
29200 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
29220 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
29230 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20  in reg 1.    ** 
29240 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20           Goto   
29250 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20      B           
29260 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20       # The loop 
29270 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20  is finished..   
29280 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
29290 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20   A: <loop body> 
292a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292b0 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77  # Return data, w
292c0 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a  hatever..    **.
292d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
292e0 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20  Return     2    
292f0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75              # Ju
29300 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47  mp back to the G
29310 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20  osub.    **.    
29320 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74  **       B: <aft
29330 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20  er the loop>.   
29340 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57   **.    */.    W
29350 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
29360 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d  c;    /* The OR-
29370 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75  clause broken ou
29380 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  t into subterms 
29390 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
293a0 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  pOrTab;       /*
293b0 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
293c0 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75   list or OR-clau
293d0 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  se generation */
293e0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
293f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
29400 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63    /* Potential c
29410 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f  overing index (o
29420 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69  r NULL) */.    i
29430 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61  nt iCovCur = pPa
29440 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a  rse->nTab++;  /*
29450 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   Cursor used for
29460 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66   index scans (if
29470 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e   any) */..    in
29480 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
29490 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
294a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
294b0 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
294c0 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
294d0 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
294e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
29500 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
29510 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
29520 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
29530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29540 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
29550 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
29560 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
29570 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
29580 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
29590 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
295a0 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
295b0 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
295e0 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
295f0 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
29600 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
29610 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
29620 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f  /* Some terms no
29630 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73  t completely tes
29640 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ted */.    int i
29650 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29670 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
29680 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45  .    Expr *pAndE
29690 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xpr = 0;        
296a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e          /* An ".
296b0 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70  . AND (...)" exp
296c0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20  ression */.   . 
296d0 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65     pTerm = pLeve
296e0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b  l->plan.u.pTerm;
296f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
29700 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
29710 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
29720 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a  rator==WO_OR );.
29730 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
29740 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
29750 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b  RM_ORINFO)!=0 );
29760 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54  .    pOrWc = &pT
29770 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
29780 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  wc;.    pLevel->
29790 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a  op = OP_Return;.
297a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
297b0 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20   regReturn;..   
297c0 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77   /* Set up a new
297d0 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54   SrcList in pOrT
297e0 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ab containing th
297f0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63  e table being sc
29800 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  anned.    ** by 
29810 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65  this loop in the
29820 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61   a[0] slot and a
29830 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  ll notReady tabl
29840 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f  es in a[1..] slo
29850 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ts..    ** This 
29860 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c  becomes the SrcL
29870 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72  ist in the recur
29880 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c  sive call to sql
29890 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
298a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
298b0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
298c0 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  1 ){.      int n
298d0 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  NotReady;       
298e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
298f0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65   number of notRe
29900 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ady tables */.  
29910 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
29920 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63  st_item *origSrc
29930 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
29940 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  l list of tables
29950 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65   */.      nNotRe
29960 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  ady = pWInfo->nL
29970 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20  evel - iLevel - 
29980 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  1;.      pOrTab 
29990 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
299a0 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
299b0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
299d0 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
299e0 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
299f0 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
29a00 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
29a10 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
29a20 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
29a30 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
29a40 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  i16)(nNotReady +
29a50 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
29a60 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
29a70 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
29a80 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
29a90 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
29aa0 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
29ab0 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
29ac0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
29ad0 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
29ae0 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
29af0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
29b00 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
29b10 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
29b20 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
29b30 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
29b40 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
29b50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29b60 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
29b70 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
29b80 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
29b90 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
29ba0 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
29bb0 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
29bc0 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
29bd0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
29be0 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
29bf0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
29c00 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
29c10 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
29c20 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
29c30 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
29c40 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
29c50 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
29c60 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
29c70 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
29c80 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
29c90 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
29ca0 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
29cb0 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
29cc0 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
29cd0 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
29ce0 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
29cf0 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
29d00 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
29d10 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
29d20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
29d30 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
29d40 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
29d50 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
29d60 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
29d70 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
29d80 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
29d90 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
29da0 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
29db0 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
29dc0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
29dd0 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
29de0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
29df0 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
29e00 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
29e10 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
29e20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
29e30 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
29e40 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
29e50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29e60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
29e70 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
29e80 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
29e90 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
29ea0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
29eb0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
29ec0 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
29ed0 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
29ee0 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
29ef0 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
29f00 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
29f10 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
29f20 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
29f30 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
29f40 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
29f50 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
29f60 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
29f70 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
29f80 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
29f90 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
29fa0 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
29fb0 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
29fc0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
29fd0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
29fe0 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
29ff0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2a000 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
2a010 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
2a020 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
2a030 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
2a040 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
2a050 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
2a060 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
2a070 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
2a080 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
2a090 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
2a0a0 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
2a0b0 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
2a0c0 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
2a0d0 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
2a0e0 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
2a0f0 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31  if( pWC->nTerm>1
2a100 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
2a110 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  erm;.      for(i
2a120 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57  Term=0; iTerm<pW
2a130 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  C->nTerm; iTerm+
2a140 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
2a150 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61   *pExpr = pWC->a
2a160 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
2a170 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
2a180 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2a190 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
2a1a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2a1b0 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54     if( pWC->a[iT
2a1c0 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
2a1d0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
2a1e0 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74  M_ORINFO) ) cont
2a1f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
2a200 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
2a210 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
2a220 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
2a230 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
2a240 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
2a250 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
2a260 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
2a270 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
2a280 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
2a290 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72  se->db, pAndExpr
2a2a0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
2a2b0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
2a2c0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2a2d0 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
2a2e0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2a2f0 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
2a300 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
2a310 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
2a320 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
2a330 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
2a340 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2a350 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
2a360 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
2a370 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
2a380 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 70  ursor==iCur || p
2a390 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
2a3a0 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20  r==WO_AND ){.   
2a3b0 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a       WhereInfo *
2a3c0 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20  pSubWInfo;      
2a3d0 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20      /* Info for 
2a3e0 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73  single OR-term s
2a3f0 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  can */.        E
2a400 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70  xpr *pOrExpr = p
2a410 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20  OrTerm->pExpr;. 
2a420 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45         if( pAndE
2a430 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
2a440 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
2a450 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20   = pOrExpr;.    
2a460 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20        pOrExpr = 
2a470 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20  pAndExpr;.      
2a480 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c    }.        /* L
2a490 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
2a4a0 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
2a4b0 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
2a4c0 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53  m. */.        pS
2a4d0 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  ubWInfo = sqlite
2a4e0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
2a4f0 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45  se, pOrTab, pOrE
2a500 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  xpr, 0, 0,.     
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a520 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50     WHERE_OMIT_OP
2a530 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45  EN_CLOSE | WHERE
2a540 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20  _AND_ONLY |.    
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a560 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f      WHERE_FORCE_
2a570 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e  TABLE | WHERE_ON
2a580 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f  ETABLE_ONLY, iCo
2a590 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61  vCur);.        a
2a5a0 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
2a5b0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
2a5c0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
2a5d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
2a5e0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
2a5f0 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
2a600 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70     WhereLevel *p
2a610 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 65  Lvl;.          e
2a620 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
2a630 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
2a640 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53  rse, pOrTab, &pS
2a650 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69  ubWInfo->a[0], i
2a660 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69  Level, pLevel->i
2a670 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20  From, 0.        
2a680 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
2a690 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
2a6a0 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
2a6b0 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
2a6c0 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74          int iSet
2a6d0 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e   = ((ii==pOrWc->
2a6e0 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b  nTerm-1)?-1:ii);
2a6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2a700 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   r;.            
2a710 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
2a720 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
2a730 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  rse, pTabItem->p
2a740 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a  Tab, -1, iCur, .
2a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a770 20 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 69           regRowi
2a780 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  d, 0);.         
2a790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a7a0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f  dOp4Int(v, OP_Ro
2a7b0 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77  wSetTest, regRow
2a7c0 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  set,.           
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a7f0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
2a800 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20  2, r, iSet);.   
2a810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a830 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2a840 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f  , regReturn, iLo
2a850 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20  opBody);..      
2a860 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57      /* The pSubW
2a870 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
2a880 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  rms flag means t
2a890 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d  hat this OR term
2a8a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
2a8b0 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d  ntained one or m
2a8c0 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f  ore AND term fro
2a8d0 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62  m a notReady tab
2a8e0 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  le.  The.       
2a8f0 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d     ** terms from
2a900 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61   the notReady ta
2a910 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ble could not be
2a920 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c   tested and will
2a930 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  .          ** ne
2a940 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ed to be tested 
2a950 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20  later..         
2a960 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2a970 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  ( pSubWInfo->unt
2a980 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74  estedTerms ) unt
2a990 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
2a9a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
2a9b0 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63   all of the OR-c
2a9c0 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61  onnected terms a
2a9d0 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  re optimized usi
2a9e0 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  ng the same.    
2a9f0 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20        ** index, 
2aa00 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73  and the index is
2aa10 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
2aa20 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75  e same cursor nu
2aa30 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  mber.          *
2aa40 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74  * by each call t
2aa50 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
2aa60 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68  gin() made by th
2aa70 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a  is loop, it may.
2aa80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
2aa90 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
2aaa0 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61 20  that index as a 
2aab0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
2aac0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2aad0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2aae0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2aaf0 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f  WhereBegin() abo
2ab00 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61  ve resulted in a
2ab10 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20   scan that.     
2ab20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20       ** uses an 
2ab30 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20  index, and this 
2ab40 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66 69  is either the fi
2ab50 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  rst OR-connected
2ab60 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
2ab70 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20  ** processed or 
2ab80 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68 65  the index is the
2ab90 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75 73   same as that us
2aba0 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f  ed by all previo
2abb0 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
2abc0 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20  terms, set pCov 
2abd0 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  to the candidate
2abe0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
2abf0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
2ac00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43  .          ** pC
2ac10 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e  ov to NULL to in
2ac20 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63  dicate that no c
2ac30 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
2ac40 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20  g index will .  
2ac50 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76          ** be av
2ac60 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ailable..       
2ac70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2ac80 70 4c 76 6c 20 3d 20 26 70 53 75 62 57 49 6e 66  pLvl = &pSubWInf
2ac90 6f 2d 3e 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20  o->a[0];.       
2aca0 20 20 20 69 66 28 20 28 70 4c 76 6c 2d 3e 70 6c     if( (pLvl->pl
2acb0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2acc0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
2acd0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c            && (pL
2ace0 76 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  vl->plan.wsFlags
2acf0 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
2ad00 44 45 58 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  DEX)==0.        
2ad10 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20     && (ii==0 || 
2ad20 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  pLvl->plan.u.pId
2ad30 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20  x==pCov).       
2ad40 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2ad50 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
2ad60 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72  iIdxCur==iCovCur
2ad70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2ad80 70 43 6f 76 20 3d 20 70 4c 76 6c 2d 3e 70 6c 61  pCov = pLvl->pla
2ad90 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20  n.u.pIdx;.      
2ada0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2adb0 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b         pCov = 0;
2adc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
2add0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
2ade0 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
2adf0 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
2ae00 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
2ae10 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
2ae20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2ae30 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
2ae40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2ae50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
2ae60 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
2ae70 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 70 4c 65   = pCov;.    pLe
2ae80 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
2ae90 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20  CovCur;.    if( 
2aea0 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
2aeb0 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
2aec0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
2aed0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
2aee0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45  Parse->db, pAndE
2aef0 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
2af00 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2af10 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c  eP1(v, iRetInit,
2af20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2af30 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
2af40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2af50 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
2af60 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
2af70 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
2af80 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2af90 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  v, iLoopBody);..
2afa0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2afb0 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74  nLevel>1 ) sqlit
2afc0 65 33 53 74 61 63 6b 46 72 65 65 28 70 50 61 72  e3StackFree(pPar
2afd0 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b  se->db, pOrTab);
2afe0 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74  .    if( !untest
2aff0 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c  edTerms ) disabl
2b000 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
2b010 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  erm);.  }else.#e
2b020 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2b030 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
2b040 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20  ION */..  {.    
2b050 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72  /* Case 5:  Ther
2b060 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
2b070 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
2b080 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
2b090 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
2b0a0 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
2b0b0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
2b0c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
2b0d0 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50  8 aStep[] = { OP
2b0e0 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d  _Next, OP_Prev }
2b0f0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
2b100 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d  st u8 aStart[] =
2b110 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50   { OP_Rewind, OP
2b120 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73  _Last };.    ass
2b130 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20  ert( bRev==0 || 
2b140 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61  bRev==1 );.    a
2b150 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
2b160 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65  ==0 );.    pLeve
2b170 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52  l->op = aStep[bR
2b180 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ev];.    pLevel-
2b190 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
2b1a0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b  pLevel->p2 = 1 +
2b1b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b1c0 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65  p2(v, aStart[bRe
2b1d0 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  v], iCur, addrBr
2b1e0 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
2b1f0 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
2b200 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
2b210 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52  STEP;.  }.  notR
2b220 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
2b230 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  (pWC->pMaskSet, 
2b240 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73  iCur);..  /* Ins
2b250 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
2b260 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
2b270 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
2b280 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
2b290 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
2b2a0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
2b2b0 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  of tables..  **.
2b2c0 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
2b2d0 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d  ION-OF: R-49525-
2b2e0 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61 74  50935 Terms that
2b2f0 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73   cannot be satis
2b300 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a  fied through.  *
2b310 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64  * the use of ind
2b320 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74  ices become test
2b330 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c 75  s that are evalu
2b340 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61 63  ated against eac
2b350 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68  h row of.  ** th
2b360 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74  e relevant input
2b370 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
2b380 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
2b390 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
2b3a0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
2b3b0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
2b3c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2b3d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
2b3e0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
2b3f0 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35   /* IMP: R-30575
2b400 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65  -11662 */.    te
2b410 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
2b420 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
2b430 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
2b440 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
2b450 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
2b460 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
2b470 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
2b480 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2b490 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
2b4a0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2b4b0 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
2b4c0 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
2b4d0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
2b4e0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2b4f0 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
2b500 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
2b510 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
2b520 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
2b530 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2b540 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
2b550 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
2b560 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
2b570 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2b580 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
2b590 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2b5a0 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
2b5b0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
2b5c0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  e;.    }.    sql
2b5d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2b5e0 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72  pParse, pE, addr
2b5f0 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
2b600 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54  PIFNULL);.    pT
2b610 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
2b620 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
2b630 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
2b640 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
2b650 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
2b660 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
2b670 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
2b680 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
2b690 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
2b6a0 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
2b6b0 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
2b6c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
2b6d0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
2b6e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
2b6f0 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
2b700 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2b710 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
2b720 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b730 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
2b740 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
2b750 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2b760 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
2b770 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
2b780 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2b790 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2b7a0 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
2b7b0 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
2b7c0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
2b7d0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
2b7e0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
2b7f0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
2b800 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d  IRTUAL );  /* IM
2b810 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  P: R-30575-11662
2b820 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
2b830 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
2b840 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
2b850 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
2b860 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
2b870 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
2b880 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
2b890 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
2b8a0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2b8b0 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
2b8c0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2b8d0 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
2b8e0 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20  edTerms );.     
2b8f0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2b900 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2b910 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
2b920 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b930 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2b940 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
2b950 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
2b960 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2b970 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
2b980 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
2b990 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
2b9a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2b9b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
2b9c0 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72  eleaseReg);..  r
2b9d0 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a  eturn notReady;.
2b9e0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
2b9f0 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
2ba00 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2ba10 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61  variable holds a
2ba20 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f   text descriptio
2ba30 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20  n of query plan 
2ba40 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20  generated.** by 
2ba50 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
2ba60 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
2ba70 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61  hereBegin().  Ea
2ba80 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65  ch call to Where
2ba90 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69  Begin.** overwri
2baa0 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  tes the previous
2bab0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
2bac0 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20  ion is used for 
2bad0 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61  testing and.** a
2bae0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
2baf0 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75  .char sqlite3_qu
2bb00 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34  ery_plan[BMS*2*4
2bb10 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  0];  /* Text of 
2bb20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74  the join */.stat
2bb30 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20  ic int nQPlan = 
2bb40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2bb50 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f  /* Next free slo
2bb60 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e  w in _query_plan
2bb70 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  [] */..#endif /*
2bb80 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
2bb90 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
2bba0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
2bbb0 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
2bbc0 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
2bbd0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
2bbe0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
2bbf0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57  .  if( ALWAYS(pW
2bc00 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74  Info) ){.    int
2bc10 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
2bc20 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
2bc30 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
2bc40 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
2bc50 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66  o *pInfo = pWInf
2bc60 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f  o->a[i].pIdxInfo
2bc70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
2bc80 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
2bc90 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e  assert( pInfo->n
2bca0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d  eedToFreeIdxStr=
2bcb0 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
2bcc0 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20  Failed ); */.   
2bcd0 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e       if( pInfo->
2bce0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2bcf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2bd00 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f  lite3_free(pInfo
2bd10 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  ->idxStr);.     
2bd20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2bd30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2bd40 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Info);.      }. 
2bd50 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
2bd60 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61  >a[i].plan.wsFla
2bd70 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
2bd80 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20  INDEX ){.       
2bd90 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
2bda0 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e  WInfo->a[i].plan
2bdb0 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20  .u.pIdx;.       
2bdc0 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
2bdd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
2bde0 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 7a  Free(db, pIdx->z
2bdf0 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 20  ColAff);.       
2be00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2be10 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  (db, pIdx);.    
2be20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2be30 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43 6c 61    }.    whereCla
2be40 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d  useClear(pWInfo-
2be50 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pWC);.    sqlit
2be60 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
2be70 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  nfo);.  }.}.../*
2be80 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
2be90 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2bea0 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
2beb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
2bec0 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
2bed0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
2bee0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2bef0 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
2bf00 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
2bf10 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
2bf20 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
2bf30 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
2bf40 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
2bf50 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
2bf60 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
2bf70 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
2bf80 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
2bf90 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2bfa0 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
2bfb0 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
2bfc0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
2bfd0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
2bfe0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2bff0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2c000 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
2c010 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
2c020 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
2c030 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
2c040 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
2c050 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
2c060 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
2c070 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
2c080 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
2c090 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
2c0a0 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
2c0b0 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
2c0c0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
2c0d0 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
2c0e0 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
2c0f0 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
2c100 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
2c110 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
2c120 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
2c130 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
2c140 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
2c150 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
2c160 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
2c170 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
2c180 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
2c190 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
2c1a0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2c1b0 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
2c1c0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
2c1d0 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2c1e0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
2c1f0 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
2c200 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
2c210 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
2c220 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
2c230 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2c240 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
2c250 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2c260 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
2c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c280 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2c290 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
2c2a0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
2c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2c0 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
2c2d0 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
2c2e0 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
2c2f0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
2c300 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
2c310 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
2c320 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
2c330 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
2c340 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
2c350 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
2c360 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
2c370 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
2c380 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
2c390 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
2c3a0 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
2c3b0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
2c3c0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
2c3d0 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
2c3e0 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
2c3f0 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
2c400 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
2c410 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
2c420 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
2c430 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
2c440 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
2c450 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
2c460 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
2c470 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
2c480 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
2c490 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
2c4a0 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
2c4b0 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
2c4c0 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
2c4d0 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
2c4e0 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
2c4f0 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
2c500 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
2c510 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
2c520 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
2c530 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
2c540 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
2c550 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2c560 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
2c570 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
2c580 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
2c590 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
2c5a0 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
2c5b0 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
2c5c0 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
2c5d0 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
2c5e0 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
2c5f0 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
2c600 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
2c610 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
2c620 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
2c630 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
2c640 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
2c650 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
2c660 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
2c670 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
2c680 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
2c690 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
2c6a0 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
2c6b0 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
2c6c0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
2c6d0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
2c6e0 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
2c6f0 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
2c700 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
2c710 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
2c720 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
2c730 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
2c740 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
2c750 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
2c760 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
2c770 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
2c780 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
2c790 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
2c7a0 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
2c7b0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
2c7c0 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
2c7d0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2c7e0 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
2c7f0 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
2c800 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2c810 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
2c820 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
2c830 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
2c840 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
2c850 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
2c860 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
2c870 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
2c880 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
2c890 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2c8a0 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
2c8b0 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
2c8c0 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
2c8d0 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
2c8e0 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
2c8f0 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
2c900 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
2c910 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
2c920 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
2c930 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
2c940 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
2c950 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
2c960 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
2c970 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
2c980 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
2c990 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
2c9a0 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
2c9b0 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
2c9c0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2c9d0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
2c9e0 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
2c9f0 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
2ca00 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
2ca10 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
2ca20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
2ca30 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
2ca40 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
2ca50 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
2ca60 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
2ca70 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
2ca80 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
2ca90 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
2caa0 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
2cab0 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
2cac0 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
2cad0 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
2cae0 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
2caf0 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
2cb00 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
2cb10 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
2cb20 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2cb30 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65  ent,.** if there
2cb40 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
2cb50 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
2cb60 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
2cb70 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
2cb80 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
2cb90 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
2cba0 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
2cbb0 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55  n pOrderBy is NU
2cbc0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
2cbd0 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
2cbe0 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61  d so that the na
2cbf0 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64  tural output ord
2cc00 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  er of the table.
2cc10 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65  ** scan is corre
2cc20 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  ct for the ORDER
2cc30 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
2cc40 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20 75   that index is u
2cc50 73 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  sed and.** the r
2cc60 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66  eturned WhereInf
2cc70 6f 2e 6e 4f 42 53 61 74 20 66 69 65 6c 64 20 69  o.nOBSat field i
2cc80 73 20 73 65 74 20 74 6f 20 70 4f 72 64 65 72 42  s set to pOrderB
2cc90 79 2d 3e 6e 45 78 70 72 2e 20 20 54 68 69 73 0a  y->nExpr.  This.
2cca0 2a 2a 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** is an optimiz
2ccb0 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65  ation that preve
2ccc0 6e 74 73 20 61 6e 20 75 6e 6e 65 63 65 73 73 61  nts an unnecessa
2ccd0 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72  ry sort of the r
2cce0 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 69 66 20  esult set.** if 
2ccf0 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72  an index appropr
2cd00 69 61 74 65 20 66 6f 72 20 74 68 65 20 4f 52 44  iate for the ORD
2cd10 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72  ER BY clause alr
2cd20 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  eady exists..**.
2cd30 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20  ** If the where 
2cd40 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e  clause loops can
2cd50 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20  not be arranged 
2cd60 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
2cd70 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74  orrect.** output
2cd80 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 57 68 65   order, then Whe
2cd90 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74 20 69 73  reInfo.nOBSat is
2cda0 20 30 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f   0..*/.WhereInfo
2cdb0 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
2cdc0 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
2cdd0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
2cde0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2cdf0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
2ce00 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
2ce10 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
2ce20 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
2ce30 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
2ce40 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
2ce50 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2ce60 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
2ce70 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
2ce80 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
2ce90 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
2cea0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
2ceb0 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20 73  tinct,  /* The s
2cec0 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72 20 44  elect-list for D
2ced0 49 53 54 49 4e 43 54 20 71 75 65 72 69 65 73 20  ISTINCT queries 
2cee0 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75  - or NULL */.  u
2cef0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
2cf00 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
2cf10 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
2cf20 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
2cf30 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
2cf40 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20   iIdxCur        
2cf50 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
2cf60 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
2cf70 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
2cf80 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
2cf90 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2cfb0 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
2cfc0 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
2cfd0 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
2cfe0 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
2cff0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d000 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
2d010 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
2d020 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2d030 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
2d040 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
2d050 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
2d060 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
2d070 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2d080 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
2d090 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
2d0a0 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
2d0b0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
2d0c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
2d0d0 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
2d0e0 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
2d0f0 64 20 2a 2f 0a 20 20 57 68 65 72 65 42 65 73 74  d */.  WhereBest
2d100 49 64 78 20 73 57 42 49 3b 20 20 20 20 20 20 20  Idx sWBI;       
2d110 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
2d120 73 65 61 72 63 68 20 63 6f 6e 74 65 78 74 20 2a  search context *
2d130 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
2d140 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
2d150 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
2d160 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
2d170 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
2d180 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  l;        /* A s
2d190 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70  ingle level in p
2d1a0 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  WInfo->a[] */.  
2d1b0 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20  int iFrom;      
2d1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2d1d0 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20  rst unused FROM 
2d1e0 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a  clause element *
2d1f0 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73  /.  int andFlags
2d200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d210 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61  * AND-ed combina
2d220 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d  tion of all pWC-
2d230 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a  >a[].wtFlags */.
2d240 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
2d250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d260 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2d270 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
2d280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d290 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
2d2a0 69 6f 6e 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61  ion */...  /* Va
2d2b0 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a  riable initializ
2d2c0 61 74 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 73 65  ation */.  memse
2d2d0 74 28 26 73 57 42 49 2c 20 30 2c 20 73 69 7a 65  t(&sWBI, 0, size
2d2e0 6f 66 28 73 57 42 49 29 29 3b 0a 20 20 73 57 42  of(sWBI));.  sWB
2d2f0 49 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  I.pParse = pPars
2d300 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d  e;..  /* The num
2d310 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
2d320 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2d330 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
2d340 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
2d350 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
2d360 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
2d370 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
2d380 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
2d390 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
2d3a0 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
2d3b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2d3c0 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
2d3d0 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
2d3e0 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
2d3f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
2d400 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2d410 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
2d420 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
2d430 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2d440 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
2d450 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
2d460 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
2d470 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
2d480 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
2d490 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
2d4a0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
2d4b0 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
2d4c0 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
2d4d0 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
2d4e0 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
2d4f0 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
2d500 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
2d510 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2d520 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
2d530 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d540 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2d550 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
2d560 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
2d570 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2d580 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
2d590 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
2d5a0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
2d5b0 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
2d5c0 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
2d5d0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
2d5e0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
2d5f0 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
2d600 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
2d610 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
2d620 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
2d630 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
2d640 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
2d650 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
2d660 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
2d670 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
2d680 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
2d690 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
2d6a0 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
2d6b0 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
2d6c0 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
2d6d0 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
2d6e0 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
2d6f0 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
2d700 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ..  */.  db = pP
2d710 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74  arse->db;.  nByt
2d720 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
2d730 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
2d740 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
2d750 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
2d760 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
2d770 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2d780 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 6e 42  ro(db, .      nB
2d790 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20  yteWInfo + .    
2d7a0 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c    sizeof(WhereCl
2d7b0 61 75 73 65 29 20 2b 0a 20 20 20 20 20 20 73 69  ause) +.      si
2d7c0 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65  zeof(WhereMaskSe
2d7d0 74 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62  t).  );.  if( db
2d7e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2d7f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
2d800 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2d810 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
2d820 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
2d830 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
2d840 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
2d850 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
2d860 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
2d870 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
2d880 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
2d890 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2d8a0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
2d8b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2d8c0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20  ;.  pWInfo->pWC 
2d8d0 3d 20 73 57 42 49 2e 70 57 43 20 3d 20 28 57 68  = sWBI.pWC = (Wh
2d8e0 65 72 65 43 6c 61 75 73 65 20 2a 29 26 28 28 75  ereClause *)&((u
2d8f0 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74  8 *)pWInfo)[nByt
2d900 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66  eWInfo];.  pWInf
2d910 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
2d920 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57  wctrlFlags;.  pW
2d930 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2d940 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
2d950 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d  nQueryLoop;.  pM
2d960 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d  askSet = (WhereM
2d970 61 73 6b 53 65 74 2a 29 26 73 57 42 49 2e 70 57  askSet*)&sWBI.pW
2d980 43 5b 31 5d 3b 0a 20 20 73 57 42 49 2e 61 4c 65  C[1];.  sWBI.aLe
2d990 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b  vel = pWInfo->a;
2d9a0 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74  ..  /* Disable t
2d9b0 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69  he DISTINCT opti
2d9c0 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49  mization if SQLI
2d9d0 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69  TE_DistinctOpt i
2d9e0 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73  s set via.  ** s
2d9f0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c  qlite3_test_ctrl
2da00 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
2da10 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e  _OPTIMIZATIONS,.
2da20 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..) */.  if( Opt
2da30 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
2da40 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73  d(db, SQLITE_Dis
2da50 74 69 6e 63 74 4f 70 74 29 20 29 20 70 44 69 73  tinctOpt) ) pDis
2da60 74 69 6e 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  tinct = 0;..  /*
2da70 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
2da80 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
2da90 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
2daa0 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
2dab0 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
2dac0 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
2dad0 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
2dae0 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
2daf0 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29  askSet(pMaskSet)
2db00 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
2db10 6e 69 74 28 73 57 42 49 2e 70 57 43 2c 20 70 50  nit(sWBI.pWC, pP
2db20 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20  arse, pMaskSet, 
2db30 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 73  wctrlFlags);.  s
2db40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
2db50 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
2db60 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
2db70 53 70 6c 69 74 28 73 57 42 49 2e 70 57 43 2c 20  Split(sWBI.pWC, 
2db80 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
2db90 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38     /* IMP: R-158
2dba0 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20 20  42-53296 */.    
2dbb0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
2dbc0 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
2dbd0 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
2dbe0 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
2dbf0 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
2dc00 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
2dc10 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
2dc20 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
2dc30 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
2dc40 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61 62   pWhere && (nTab
2dc50 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
2dc60 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
2dc70 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29  NotJoin(pWhere))
2dc80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2dc90 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2dca0 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66  e, pWhere, pWInf
2dcb0 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54  o->iBreak, SQLIT
2dcc0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
2dcd0 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
2dce0 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20   }..  /* Assign 
2dcf0 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62  a bit from the b
2dd00 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20  itmask to every 
2dd10 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
2dd20 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
2dd30 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e  ** When assignin
2dd40 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  g bitmask values
2dd50 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   to FROM clause 
2dd60 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74  cursors, it must
2dd70 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73   be.  ** the cas
2dd80 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74  e that if X is t
2dd90 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
2dda0 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61  he N-th FROM cla
2ddb0 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20  use term then.  
2ddc0 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  ** the bitmask f
2ddd0 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  or all FROM clau
2dde0 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  se terms to the 
2ddf0 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68  left of the N-th
2de00 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58   term.  ** is (X
2de10 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73  -1).   An expres
2de20 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e  sion from the ON
2de30 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
2de40 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20  T JOIN can use. 
2de50 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69   ** its Expr.iRi
2de60 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c  ghtJoinTable val
2de70 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62  ue to find the b
2de80 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69  itmask of the ri
2de90 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ght table.  ** o
2dea0 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62  f the join.  Sub
2deb0 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f  tracting one fro
2dec0 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  m the right tabl
2ded0 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20  e bitmask gives 
2dee0 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66  a.  ** bitmask f
2def0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
2df00 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
2df10 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20   join.  Knowing 
2df20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
2df30 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2df40 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61  to the left of a
2df50 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d   left join is im
2df60 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74  portant.  Ticket
2df70 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a   #3015..  **.  *
2df80 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
2df90 57 68 65 72 65 43 6c 61 75 73 65 2e 76 6d 61 73  WhereClause.vmas
2dfa0 6b 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68  k variable so th
2dfb0 61 74 20 62 69 74 73 20 74 68 61 74 20 63 6f 72  at bits that cor
2dfc0 72 65 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20  respond.  ** to 
2dfd0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
2dfe0 72 73 6f 72 73 20 61 72 65 20 73 65 74 2e 20 54  rsors are set. T
2dff0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
2e000 65 6c 65 63 74 69 76 65 6c 79 20 64 69 73 61 62  electively disab
2e010 6c 65 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52 2d  le .  ** the OR-
2e020 74 6f 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d 61  to-IN transforma
2e030 74 69 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61 6c  tion in exprAnal
2e040 79 7a 65 4f 72 54 65 72 6d 28 29 2e 20 49 74 20  yzeOrTerm(). It 
2e050 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 0a  is not helpful .
2e060 20 20 2a 2a 20 77 69 74 68 20 76 69 72 74 75 61    ** with virtua
2e070 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
2e080 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
2e090 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
2e0a0 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
2e0b0 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
2e0c0 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
2e0d0 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
2e0e0 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
2e0f0 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
2e100 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
2e110 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
2e120 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
2e130 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
2e140 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
2e150 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  * WHERE_ONETABLE
2e160 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
2e170 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
2e180 28 20 73 57 42 49 2e 70 57 43 2d 3e 76 6d 61 73  ( sWBI.pWC->vmas
2e190 6b 3d 3d 30 20 26 26 20 70 4d 61 73 6b 53 65 74  k==0 && pMaskSet
2e1a0 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ->n==0 );.  for(
2e1b0 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
2e1c0 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
2e1d0 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
2e1e0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
2e1f0 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
2e200 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2e210 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2e220 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57 41  BLE.    if( ALWA
2e230 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  YS(pTabList->a[i
2e240 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56 69  i].pTab) && IsVi
2e250 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e  rtual(pTabList->
2e260 61 5b 69 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20  a[ii].pTab) ){. 
2e270 20 20 20 20 20 73 57 42 49 2e 70 57 43 2d 3e 76       sWBI.pWC->v
2e280 6d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73  mask |= ((Bitmas
2e290 6b 29 31 20 3c 3c 20 69 69 29 3b 0a 20 20 20 20  k)1 << ii);.    
2e2a0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  }.#endif.  }.#if
2e2b0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a  ndef NDEBUG.  {.
2e2c0 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68      Bitmask toTh
2e2d0 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66  eLeft = 0;.    f
2e2e0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
2e2f0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
2e300 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
2e310 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   m = getMask(pMa
2e320 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
2e330 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
2e340 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2e350 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20  m-1)==toTheLeft 
2e360 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65  );.      toTheLe
2e370 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20  ft |= m;.    }. 
2e380 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2e390 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
2e3a0 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
2e3b0 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78  s.  Note that ex
2e3c0 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68  prAnalyze() migh
2e3d0 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76  t.  ** add new v
2e3e0 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74  irtual terms ont
2e3f0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
2e400 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2e410 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77  We do not.  ** w
2e420 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74  ant to analyze t
2e430 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72  hese virtual ter
2e440 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61  ms, so start ana
2e450 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e  lyzing at the en
2e460 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20  d.  ** and work 
2e470 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20  forward so that 
2e480 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61  the added virtua
2e490 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65  l terms are neve
2e4a0 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  r processed..  *
2e4b0 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  /.  exprAnalyzeA
2e4c0 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 73 57 42  ll(pTabList, sWB
2e4d0 49 2e 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62  I.pWC);.  if( db
2e4e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e4f0 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
2e500 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
2e510 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
2e520 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
2e530 69 66 69 65 72 2c 20 69 66 20 74 68 65 72 65 20  ifier, if there 
2e540 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e  is one, is redun
2e550 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69  dant. .  ** If i
2e560 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20 70  t is, then set p
2e570 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c  Distinct to NULL
2e580 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e 65   and WhereInfo.e
2e590 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a  Distinct to.  **
2e5a0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2e5b0 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20 74  UNIQUE to tell t
2e5c0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e  he caller to ign
2e5d0 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ore the DISTINCT
2e5e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 69  ..  */.  if( pDi
2e5f0 73 74 69 6e 63 74 20 26 26 20 69 73 44 69 73 74  stinct && isDist
2e600 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50  inctRedundant(pP
2e610 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2e620 73 57 42 49 2e 70 57 43 2c 20 70 44 69 73 74 69  sWBI.pWC, pDisti
2e630 6e 63 74 29 20 29 7b 0a 20 20 20 20 70 44 69 73  nct) ){.    pDis
2e640 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 70  tinct = 0;.    p
2e650 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2e660 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2e670 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20  T_UNIQUE;.  }.. 
2e680 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65   /* Chose the be
2e690 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
2e6a0 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
2e6b0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2e6c0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
2e6d0 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20  s loop fills in 
2e6e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
2e6f0 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  elds:.  **.  ** 
2e700 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49    pWInfo->a[].pI
2e710 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65  dx      The inde
2e720 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  x to use for thi
2e730 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c  s level of the l
2e740 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e  oop..  **   pWIn
2e750 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20  fo->a[].wsFlags 
2e760 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67    WHERE_xxx flag
2e770 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2e780 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57  h pIdx.  **   pW
2e790 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20  Info->a[].nEq   
2e7a0 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
2e7b0 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  f == and IN cons
2e7c0 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70  traints.  **   p
2e7d0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d  WInfo->a[].iFrom
2e7e0 20 20 20 20 20 57 68 69 63 68 20 74 65 72 6d 20       Which term 
2e7f0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
2e800 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65  se is being code
2e810 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  d.  **   pWInfo-
2e820 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54  >a[].iTabCur   T
2e830 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
2e840 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2e850 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49  table.  **   pWI
2e860 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72  nfo->a[].iIdxCur
2e870 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
2e880 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
2e890 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2e8a0 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57 68  a[].pTerm     Wh
2e8b0 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f  en wsFlags==WO_O
2e8c0 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65  R, the OR-clause
2e8d0 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20   term.  **.  ** 
2e8e0 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66  This loop also f
2e8f0 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e  igures out the n
2e900 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20  esting order of 
2e910 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2e920 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a  OM.  ** clause..
2e930 20 20 2a 2f 0a 20 20 73 57 42 49 2e 6e 6f 74 56    */.  sWBI.notV
2e940 61 6c 69 64 20 3d 20 7e 28 42 69 74 6d 61 73 6b  alid = ~(Bitmask
2e950 29 30 3b 0a 20 20 73 57 42 49 2e 70 4f 72 64 65  )0;.  sWBI.pOrde
2e960 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
2e970 20 20 73 57 42 49 2e 6e 20 3d 20 6e 54 61 62 4c    sWBI.n = nTabL
2e980 69 73 74 3b 0a 20 20 73 57 42 49 2e 70 44 69 73  ist;.  sWBI.pDis
2e990 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63  tinct = pDistinc
2e9a0 74 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20  t;.  andFlags = 
2e9b0 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  ~0;.  WHERETRACE
2e9c0 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
2e9d0 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b   Start ***\n"));
2e9e0 0a 20 20 66 6f 72 28 73 57 42 49 2e 69 3d 69 46  .  for(sWBI.i=iF
2e9f0 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  rom=0, pLevel=pW
2ea00 49 6e 66 6f 2d 3e 61 3b 20 73 57 42 49 2e 69 3c  Info->a; sWBI.i<
2ea10 6e 54 61 62 4c 69 73 74 3b 20 73 57 42 49 2e 69  nTabList; sWBI.i
2ea20 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
2ea30 20 20 20 57 68 65 72 65 43 6f 73 74 20 62 65 73     WhereCost bes
2ea40 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f  tPlan;         /
2ea50 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74  * Most efficient
2ea60 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61   plan seen so fa
2ea70 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  r */.    Index *
2ea80 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
2ea90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
2eaa0 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20  r FROM table at 
2eab0 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20  pTabItem */.    
2eac0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2eae0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
2eaf0 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  FROM tables */. 
2eb00 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d     int bestJ = -
2eb10 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
2eb20 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a  * The value of j
2eb30 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   */.    Bitmask 
2eb40 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2eb50 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76      /* Bitmask v
2eb60 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65  alue for j or be
2eb70 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  stJ */.    int i
2eb80 73 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20 20 20  sOptimal;       
2eb90 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2eba0 6f 72 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e  or for optimal/n
2ebb0 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72 63  on-optimal searc
2ebc0 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e  h */.    int nUn
2ebd0 63 6f 6e 73 74 72 61 69 6e 65 64 3b 20 20 20 20  constrained;    
2ebe0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
2ebf0 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e  ables without IN
2ec00 44 45 58 45 44 20 42 59 20 2a 2f 0a 20 20 20 20  DEXED BY */.    
2ec10 42 69 74 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78  Bitmask notIndex
2ec20 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ed;         /* M
2ec30 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68  ask of tables th
2ec40 61 74 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  at cannot use an
2ec50 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d   index */..    m
2ec60 65 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c  emset(&bestPlan,
2ec70 20 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50   0, sizeof(bestP
2ec80 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50  lan));.    bestP
2ec90 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49  lan.rCost = SQLI
2eca0 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20  TE_BIG_DBL;.    
2ecb0 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
2ecc0 20 42 65 67 69 6e 20 73 65 61 72 63 68 20 66 6f   Begin search fo
2ecd0 72 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22  r loop %d ***\n"
2ece0 2c 20 73 57 42 49 2e 69 29 29 3b 0a 0a 20 20 20  , sWBI.i));..   
2ecf0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
2ed00 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 65   the remaining e
2ed10 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ntries in the FR
2ed20 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 66 69 6e  OM clause to fin
2ed30 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78  d the.    ** nex
2ed40 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54  t nested loop. T
2ed50 68 65 20 6c 6f 6f 70 20 74 65 73 74 73 20 61 6c  he loop tests al
2ed60 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  l FROM clause en
2ed70 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 65 69 74  tries.    ** eit
2ed80 68 65 72 20 6f 6e 63 65 20 6f 72 20 74 77 69 63  her once or twic
2ed90 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e. .    **.    *
2eda0 2a 20 54 68 65 20 66 69 72 73 74 20 74 65 73 74  * The first test
2edb0 20 69 73 20 61 6c 77 61 79 73 20 70 65 72 66 6f   is always perfo
2edc0 72 6d 65 64 20 69 66 20 74 68 65 72 65 20 61 72  rmed if there ar
2edd0 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 65 6e  e two or more en
2ede0 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 72 65 6d  tries.    ** rem
2edf0 61 69 6e 69 6e 67 20 61 6e 64 20 6e 65 76 65 72  aining and never
2ee00 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68   performed if th
2ee10 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
2ee20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
2ee30 79 0a 20 20 20 20 2a 2a 20 74 6f 20 63 68 6f 6f  y.    ** to choo
2ee40 73 65 20 66 72 6f 6d 2e 20 20 54 68 65 20 66 69  se from.  The fi
2ee50 72 73 74 20 74 65 73 74 20 6c 6f 6f 6b 73 20 66  rst test looks f
2ee60 6f 72 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20  or an "optimal" 
2ee70 73 63 61 6e 2e 20 20 49 6e 0a 20 20 20 20 2a 2a  scan.  In.    **
2ee80 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 61 6e   this context an
2ee90 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 69 73   optimal scan is
2eea0 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73 20 74   one that uses t
2eeb0 68 65 20 73 61 6d 65 20 73 74 72 61 74 65 67 79  he same strategy
2eec0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
2eed0 67 69 76 65 6e 20 46 52 4f 4d 20 63 6c 61 75 73  given FROM claus
2eee0 65 20 65 6e 74 72 79 20 61 73 20 77 6f 75 6c 64  e entry as would
2eef0 20 62 65 20 73 65 6c 65 63 74 65 64 20 69 66 20   be selected if 
2ef00 74 68 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a  the entry.    **
2ef10 20 77 65 72 65 20 75 73 65 64 20 61 73 20 74 68   were used as th
2ef20 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6e 65 73 74  e innermost nest
2ef30 65 64 20 6c 6f 6f 70 2e 20 20 49 6e 20 6f 74 68  ed loop.  In oth
2ef40 65 72 20 77 6f 72 64 73 2c 20 61 20 74 61 62 6c  er words, a tabl
2ef50 65 0a 20 20 20 20 2a 2a 20 69 73 20 63 68 6f 73  e.    ** is chos
2ef60 65 6e 20 73 75 63 68 20 74 68 61 74 20 74 68 65  en such that the
2ef70 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67   cost of running
2ef80 20 74 68 61 74 20 74 61 62 6c 65 20 63 61 6e 6e   that table cann
2ef90 6f 74 20 62 65 20 72 65 64 75 63 65 64 0a 20 20  ot be reduced.  
2efa0 20 20 2a 2a 20 62 79 20 77 61 69 74 69 6e 67 20    ** by waiting 
2efb0 66 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73  for other tables
2efc0 20 74 6f 20 72 75 6e 20 66 69 72 73 74 2e 20 20   to run first.  
2efd0 54 68 69 73 20 22 6f 70 74 69 6d 61 6c 22 20 74  This "optimal" t
2efe0 65 73 74 20 77 6f 72 6b 73 0a 20 20 20 20 2a 2a  est works.    **
2eff0 20 62 79 20 66 69 72 73 74 20 61 73 73 75 6d 69   by first assumi
2f000 6e 67 20 74 68 61 74 20 74 68 65 20 46 52 4f 4d  ng that the FROM
2f010 20 63 6c 61 75 73 65 20 69 73 20 6f 6e 20 74 68   clause is on th
2f020 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e 64  e inner loop and
2f030 20 66 69 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20   finding.    ** 
2f040 69 74 73 20 71 75 65 72 79 20 70 6c 61 6e 2c 20  its query plan, 
2f050 74 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 74 6f  then checking to
2f060 20 73 65 65 20 69 66 20 74 68 61 74 20 71 75 65   see if that que
2f070 72 79 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 79  ry plan uses any
2f080 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 46 52  .    ** other FR
2f090 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
2f0a0 74 68 61 74 20 61 72 65 20 73 57 42 49 2e 6e 6f  that are sWBI.no
2f0b0 74 56 61 6c 69 64 2e 20 20 49 66 20 6e 6f 20 6e  tValid.  If no n
2f0c0 6f 74 56 61 6c 69 64 20 74 65 72 6d 73 0a 20 20  otValid terms.  
2f0d0 20 20 2a 2a 20 61 72 65 20 75 73 65 64 20 74 68    ** are used th
2f0e0 65 6e 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22  en the "optimal"
2f0f0 20 71 75 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b   query plan work
2f100 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
2f110 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 57   Note that the W
2f120 68 65 72 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61  hereCost.nRow pa
2f130 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
2f140 70 74 69 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68  ptimal scan migh
2f150 74 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20  t.    ** not be 
2f160 61 73 20 73 6d 61 6c 6c 20 61 73 20 69 74 20 77  as small as it w
2f170 6f 75 6c 64 20 62 65 20 69 66 20 74 68 65 20 74  ould be if the t
2f180 61 62 6c 65 20 72 65 61 6c 6c 79 20 77 65 72 65  able really were
2f190 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20   the innermost. 
2f1a0 20 20 20 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65     ** join.  The
2f1b0 20 6e 52 6f 77 20 76 61 6c 75 65 20 63 61 6e 20   nRow value can 
2f1c0 62 65 20 72 65 64 75 63 65 64 20 62 79 20 57 48  be reduced by WH
2f1d0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
2f1e0 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68  raints.    ** th
2f1f0 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e  at do not use in
2f200 64 69 63 65 73 2e 20 20 42 75 74 20 74 68 69 73  dices.  But this
2f210 20 6e 52 6f 77 20 72 65 64 75 63 74 69 6f 6e 20   nRow reduction 
2f220 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
2f230 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
2f240 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 20 69   really is the i
2f250 6e 6e 65 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20  nnermost join.  
2f260 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2f270 68 65 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69  he second loop i
2f280 74 65 72 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  teration is only
2f290 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f   performed if no
2f2a0 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20   optimal scan.  
2f2b0 20 20 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20    ** strategies 
2f2c0 77 65 72 65 20 66 6f 75 6e 64 20 62 79 20 74 68  were found by th
2f2d0 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
2f2e0 6e 2e 20 54 68 69 73 20 73 65 63 6f 6e 64 20 69  n. This second i
2f2f0 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  teration.    ** 
2f300 69 73 20 75 73 65 64 20 74 6f 20 73 65 61 72 63  is used to searc
2f310 68 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 73 74  h for the lowest
2f320 20 63 6f 73 74 20 73 63 61 6e 20 6f 76 65 72 61   cost scan overa
2f330 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ll..    **.    *
2f340 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
2f350 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 65  ons of SQLite pe
2f360 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20 74 68 65  rformed only the
2f370 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
2f380 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e  n -.    ** the n
2f390 65 78 74 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f  ext outermost lo
2f3a0 6f 70 20 77 61 73 20 61 6c 77 61 79 73 20 74 68  op was always th
2f3b0 61 74 20 77 69 74 68 20 74 68 65 20 6c 6f 77 65  at with the lowe
2f3c0 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20 20 20 2a  st overall.    *
2f3d0 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76 65 72 2c  * cost. However,
2f3e0 20 74 68 69 73 20 6d 65 61 6e 74 20 74 68 61 74   this meant that
2f3f0 20 53 51 4c 69 74 65 20 63 6f 75 6c 64 20 73 65   SQLite could se
2f400 6c 65 63 74 20 74 68 65 20 77 72 6f 6e 67 20 70  lect the wrong p
2f410 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 20 73  lan.    ** for s
2f420 63 72 69 70 74 73 20 73 75 63 68 20 61 73 20 74  cripts such as t
2f430 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
2f440 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20    **   .    **  
2f450 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2f460 28 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20  (a, b); .    ** 
2f470 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2f480 32 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20  2(c, d);.    ** 
2f490 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2f4a0 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 32 2e  t2, t1 WHERE t2.
2f4b0 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20  rowid = t1.a;.  
2f4c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2f4d0 62 65 73 74 20 73 74 72 61 74 65 67 79 20 69 73  best strategy is
2f4e0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2f4f0 75 67 68 20 74 61 62 6c 65 20 74 31 20 66 69 72  ugh table t1 fir
2f500 73 74 2e 20 48 6f 77 65 76 65 72 20 69 74 0a 20  st. However it. 
2f510 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73     ** is not pos
2f520 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  sible to determi
2f530 6e 65 20 74 68 69 73 20 77 69 74 68 20 61 20 73  ne this with a s
2f540 69 6d 70 6c 65 20 67 72 65 65 64 79 20 61 6c 67  imple greedy alg
2f550 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53  orithm..    ** S
2f560 69 6e 63 65 20 74 68 65 20 63 6f 73 74 20 6f 66  ince the cost of
2f570 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
2f580 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 32 20  hrough table t2 
2f590 69 73 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20  is the same .   
2f5a0 20 2a 2a 20 61 73 20 74 68 65 20 63 6f 73 74 20   ** as the cost 
2f5b0 6f 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  of a linear scan
2f5c0 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74   through table t
2f5d0 31 2c 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65  1, a simple gree
2f5e0 64 79 20 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72  dy .    ** algor
2f5f0 69 74 68 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20  ithm may choose 
2f600 74 6f 20 75 73 65 20 74 32 20 66 6f 72 20 74 68  to use t2 for th
2f610 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68  e outer loop, wh
2f620 69 63 68 20 69 73 20 61 20 6d 75 63 68 0a 20 20  ich is a much.  
2f630 20 20 2a 2a 20 63 6f 73 74 6c 69 65 72 20 61 70    ** costlier ap
2f640 70 72 6f 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20  proach..    */. 
2f650 20 20 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65     nUnconstraine
2f660 64 20 3d 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e  d = 0;.    notIn
2f670 64 65 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 66  dexed = 0;.    f
2f680 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d 28 69 46  or(isOptimal=(iF
2f690 72 6f 6d 3c 6e 54 61 62 4c 69 73 74 2d 31 29 3b  rom<nTabList-1);
2f6a0 20 69 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26   isOptimal>=0 &&
2f6b0 20 62 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69   bestJ<0; isOpti
2f6c0 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 66 6f  mal--){.      fo
2f6d0 72 28 6a 3d 69 46 72 6f 6d 2c 20 73 57 42 49 2e  r(j=iFrom, sWBI.
2f6e0 70 53 72 63 3d 26 70 54 61 62 4c 69 73 74 2d 3e  pSrc=&pTabList->
2f6f0 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74  a[j]; j<nTabList
2f700 3b 20 6a 2b 2b 2c 20 73 57 42 49 2e 70 53 72 63  ; j++, sWBI.pSrc
2f710 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
2f720 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20   doNotReorder;  
2f730 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2f740 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e  s table should n
2f750 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20  ot be reordered 
2f760 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20 20 64 6f  */.  .        do
2f770 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28 73  NotReorder =  (s
2f780 57 42 49 2e 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  WBI.pSrc->jointy
2f790 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
2f7a0 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20  _CROSS))!=0;.   
2f7b0 20 20 20 20 20 69 66 28 20 6a 21 3d 69 46 72 6f       if( j!=iFro
2f7c0 6d 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65  m && doNotReorde
2f7d0 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
2f7e0 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70     m = getMask(p
2f7f0 4d 61 73 6b 53 65 74 2c 20 73 57 42 49 2e 70 53  MaskSet, sWBI.pS
2f800 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  rc->iCursor);.  
2f810 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 73        if( (m & s
2f820 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d 30  WBI.notValid)==0
2f830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2f840 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72  ( j==iFrom ) iFr
2f850 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  om++;.          
2f860 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2f870 20 20 7d 0a 20 20 20 20 20 20 20 20 73 57 42 49    }.        sWBI
2f880 2e 6e 6f 74 52 65 61 64 79 20 3d 20 28 69 73 4f  .notReady = (isO
2f890 70 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 73 57 42  ptimal ? m : sWB
2f8a0 49 2e 6e 6f 74 56 61 6c 69 64 29 3b 0a 20 20 20  I.notValid);.   
2f8b0 20 20 20 20 20 69 66 28 20 73 57 42 49 2e 70 53       if( sWBI.pS
2f8c0 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20  rc->pIndex==0 ) 
2f8d0 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b  nUnconstrained++
2f8e0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 57 48 45  ;.  .        WHE
2f8f0 52 45 54 52 41 43 45 28 28 22 20 20 20 3d 3d 3d  RETRACE(("   ===
2f900 20 74 72 79 69 6e 67 20 74 61 62 6c 65 20 25 64   trying table %d
2f910 20 28 25 73 29 20 77 69 74 68 20 69 73 4f 70 74   (%s) with isOpt
2f920 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e 22 2c 0a  imal=%d ===\n",.
2f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f940 20 20 20 20 6a 2c 20 73 57 42 49 2e 70 53 72 63      j, sWBI.pSrc
2f950 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 69  ->pTab->zName, i
2f960 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20 20  sOptimal));.    
2f970 20 20 20 20 61 73 73 65 72 74 28 20 73 57 42 49      assert( sWBI
2f980 2e 70 53 72 63 2d 3e 70 54 61 62 20 29 3b 0a 23  .pSrc->pTab );.#
2f990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f9a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2f9b0 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
2f9c0 72 74 75 61 6c 28 73 57 42 49 2e 70 53 72 63 2d  rtual(sWBI.pSrc-
2f9d0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
2f9e0 20 20 20 20 73 57 42 49 2e 70 70 49 64 78 49 6e      sWBI.ppIdxIn
2f9f0 66 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  fo = &pWInfo->a[
2fa00 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20  j].pIdxInfo;.   
2fa10 20 20 20 20 20 20 20 62 65 73 74 56 69 72 74 75         bestVirtu
2fa20 61 6c 49 6e 64 65 78 28 26 73 57 42 49 29 3b 0a  alIndex(&sWBI);.
2fa30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23          }else .#
2fa40 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
2fa50 20 20 20 20 20 20 20 20 20 20 62 65 73 74 42 74            bestBt
2fa60 72 65 65 49 6e 64 65 78 28 26 73 57 42 49 29 3b  reeIndex(&sWBI);
2fa70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fa80 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 74     assert( isOpt
2fa90 69 6d 61 6c 20 7c 7c 20 28 73 57 42 49 2e 63 6f  imal || (sWBI.co
2faa0 73 74 2e 75 73 65 64 26 73 57 42 49 2e 6e 6f 74  st.used&sWBI.not
2fab0 56 61 6c 69 64 29 3d 3d 30 20 29 3b 0a 0a 20 20  Valid)==0 );..  
2fac0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49        /* If an I
2fad0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2fae0 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
2faf0 6e 20 74 68 65 20 70 6c 61 6e 20 6d 75 73 74 20  n the plan must 
2fb00 75 73 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  use that.       
2fb10 20 2a 2a 20 69 6e 64 65 78 20 69 66 20 69 74 20   ** index if it 
2fb20 75 73 65 73 20 61 6e 79 20 69 6e 64 65 78 20 61  uses any index a
2fb30 74 20 61 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20  t all */.       
2fb40 20 61 73 73 65 72 74 28 20 73 57 42 49 2e 70 53   assert( sWBI.pS
2fb50 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20  rc->pIndex==0 . 
2fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb70 20 7c 7c 20 28 73 57 42 49 2e 63 6f 73 74 2e 70   || (sWBI.cost.p
2fb80 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2fb90 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
2fba0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2fbb0 20 20 20 20 20 20 20 7c 7c 20 73 57 42 49 2e 63         || sWBI.c
2fbc0 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  ost.plan.u.pIdx=
2fbd0 3d 73 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e 64  =sWBI.pSrc->pInd
2fbe0 65 78 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  ex );..        i
2fbf0 66 28 20 69 73 4f 70 74 69 6d 61 6c 20 26 26 20  f( isOptimal && 
2fc00 28 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e  (sWBI.cost.plan.
2fc10 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2fc20 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
2fc30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   ){.          no
2fc40 74 49 6e 64 65 78 65 64 20 7c 3d 20 6d 3b 0a 20  tIndexed |= m;. 
2fc50 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2fc60 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20    /* Conditions 
2fc70 75 6e 64 65 72 20 77 68 69 63 68 20 74 68 69 73  under which this
2fc80 20 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20 74   table becomes t
2fc90 68 65 20 62 65 73 74 20 73 6f 20 66 61 72 3a 0a  he best so far:.
2fca0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2fcb0 20 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20     **   (1) The 
2fcc0 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20 64  table must not d
2fcd0 65 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72 20 74  epend on other t
2fce0 61 62 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  ables that have 
2fcf0 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  not.        **  
2fd00 20 20 20 20 20 79 65 74 20 72 75 6e 2e 20 20 28       yet run.  (
2fd10 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2fd20 69 74 20 6d 75 73 74 20 6e 6f 74 20 64 65 70 65  it must not depe
2fd30 6e 64 20 6f 6e 20 74 61 62 6c 65 73 0a 20 20 20  nd on tables.   
2fd40 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e       **       in
2fd50 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 2e 29 0a 20   inner loops.). 
2fd60 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2fd70 20 20 2a 2a 20 20 20 28 32 29 20 41 20 66 75 6c    **   (2) A ful
2fd80 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 70 6c 61  l-table-scan pla
2fd90 6e 20 63 61 6e 6e 6f 74 20 73 75 70 65 72 63 65  n cannot superce
2fda0 64 65 20 69 6e 64 65 78 65 64 20 70 6c 61 6e 20  de indexed plan 
2fdb0 75 6e 6c 65 73 73 0a 20 20 20 20 20 20 20 20 2a  unless.        *
2fdc0 2a 20 20 20 20 20 20 20 74 68 65 20 66 75 6c 6c  *       the full
2fdd0 2d 74 61 62 6c 65 2d 73 63 61 6e 20 69 73 20 61  -table-scan is a
2fde0 6e 20 22 6f 70 74 69 6d 61 6c 22 20 70 6c 61 6e  n "optimal" plan
2fdf0 20 61 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76   as defined abov
2fe00 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
2fe10 20 20 20 20 20 20 2a 2a 20 20 20 28 33 29 20 41        **   (3) A
2fe20 6c 6c 20 74 61 62 6c 65 73 20 68 61 76 65 20 61  ll tables have a
2fe30 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
2fe40 75 73 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c  use or this tabl
2fe50 65 20 6c 61 63 6b 73 20 61 6e 0a 20 20 20 20 20  e lacks an.     
2fe60 20 20 20 2a 2a 20 20 20 20 20 20 20 49 4e 44 45     **       INDE
2fe70 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72  XED BY clause or
2fe80 20 74 68 69 73 20 74 61 62 6c 65 20 75 73 65 73   this table uses
2fe90 20 74 68 65 20 73 70 65 63 69 66 69 63 0a 20 20   the specific.  
2fea0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69        **       i
2feb0 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20 62  ndex specified b
2fec0 79 20 69 74 73 20 49 4e 44 45 58 45 44 20 42 59  y its INDEXED BY
2fed0 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 72   clause.  This r
2fee0 75 6c 65 20 65 6e 73 75 72 65 73 0a 20 20 20 20  ule ensures.    
2fef0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68 61      **       tha
2ff00 74 20 61 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  t a best-so-far 
2ff10 69 73 20 61 6c 77 61 79 73 20 73 65 6c 65 63 74  is always select
2ff20 65 64 20 65 76 65 6e 20 69 66 20 61 6e 20 69 6d  ed even if an im
2ff30 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
2ff40 20 2a 2a 20 20 20 20 20 20 20 63 6f 6d 62 69 6e   **       combin
2ff50 61 74 69 6f 6e 20 6f 66 20 49 4e 44 45 58 45 44  ation of INDEXED
2ff60 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20   BY clauses are 
2ff70 67 69 76 65 6e 2e 20 20 54 68 65 20 65 72 72 6f  given.  The erro
2ff80 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  r.        **    
2ff90 20 20 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63     will be detec
2ffa0 74 65 64 20 61 6e 64 20 72 65 6c 61 79 65 64 20  ted and relayed 
2ffb0 62 61 63 6b 20 74 6f 20 74 68 65 20 61 70 70 6c  back to the appl
2ffc0 69 63 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 20  ication later.. 
2ffd0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
2ffe0 54 68 65 20 4e 45 56 45 52 28 29 20 63 6f 6d 65  The NEVER() come
2fff0 73 20 61 62 6f 75 74 20 62 65 63 61 75 73 65 20  s about because 
30000 72 75 6c 65 20 28 32 29 20 61 62 6f 76 65 20 70  rule (2) above p
30010 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20  revents.        
30020 2a 2a 20 20 20 20 20 20 20 41 6e 20 69 6e 64 65  **       An inde
30030 78 61 62 6c 65 20 66 75 6c 6c 2d 74 61 62 6c 65  xable full-table
30040 2d 73 63 61 6e 20 66 72 6f 6d 20 72 65 61 63 68  -scan from reach
30050 69 6e 67 20 72 75 6c 65 20 28 33 29 2e 0a 20 20  ing rule (3)..  
30060 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
30070 20 2a 2a 20 20 20 28 34 29 20 54 68 65 20 70 6c   **   (4) The pl
30080 61 6e 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20  an cost must be 
30090 6c 6f 77 65 72 20 74 68 61 6e 20 70 72 69 6f 72  lower than prior
300a0 20 70 6c 61 6e 73 2c 20 77 68 65 72 65 20 22 63   plans, where "c
300b0 6f 73 74 22 0a 20 20 20 20 20 20 20 20 2a 2a 20  ost".        ** 
300c0 20 20 20 20 20 20 69 73 20 64 65 66 69 6e 65 64        is defined
300d0 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 65 43   by the compareC
300e0 6f 73 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ost() function a
300f0 62 6f 76 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  bove. .        *
30100 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 73  /.        if( (s
30110 57 42 49 2e 63 6f 73 74 2e 75 73 65 64 26 73 57  WBI.cost.used&sW
30120 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20  BI.notValid)==0 
30130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30140 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
30150 20 20 20 20 20 20 20 20 20 26 26 20 28 62 65 73           && (bes
30160 74 4a 3c 30 20 7c 7c 20 28 6e 6f 74 49 6e 64 65  tJ<0 || (notInde
30170 78 65 64 26 6d 29 21 3d 30 20 20 20 20 20 20 20  xed&m)!=0       
30180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30190 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (2) */.        
301a0 20 20 20 20 20 20 20 20 7c 7c 20 28 62 65 73 74          || (best
301b0 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
301c0 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
301d0 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20  LLSCAN)==0.     
301e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73             || (s
301f0 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73  WBI.cost.plan.ws
30200 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
30210 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 0a  T_FULLSCAN)!=0).
30220 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
30230 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3d 3d  nUnconstrained==
30240 30 20 7c 7c 20 73 57 42 49 2e 70 53 72 63 2d 3e  0 || sWBI.pSrc->
30250 70 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 20  pIndex==0       
30260 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
30270 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 4e 45             || NE
30280 56 45 52 28 28 73 57 42 49 2e 63 6f 73 74 2e 70  VER((sWBI.cost.p
30290 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
302a0 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
302b0 29 21 3d 30 29 29 0a 20 20 20 20 20 20 20 20 20  )!=0)).         
302c0 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c     && (bestJ<0 |
302d0 7c 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 26 73  | compareCost(&s
302e0 57 42 49 2e 63 6f 73 74 2c 20 26 62 65 73 74 50  WBI.cost, &bestP
302f0 6c 61 6e 29 29 20 20 20 2f 2a 20 28 34 29 20 2a  lan))   /* (4) *
30300 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
30310 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
30320 45 28 28 22 20 20 20 3d 3d 3d 20 74 61 62 6c 65  E(("   === table
30330 20 25 64 20 28 25 73 29 20 69 73 20 62 65 73 74   %d (%s) is best
30340 20 73 6f 20 66 61 72 5c 6e 22 0a 20 20 20 20 20   so far\n".     
30350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30360 20 22 20 20 20 20 20 20 20 63 6f 73 74 3d 25 2e   "       cost=%.
30370 31 66 2c 20 6e 52 6f 77 3d 25 2e 31 66 2c 20 6e  1f, nRow=%.1f, n
30380 4f 42 53 61 74 3d 25 64 2c 20 77 73 46 6c 61 67  OBSat=%d, wsFlag
30390 73 3d 25 30 38 78 5c 6e 22 2c 0a 20 20 20 20 20  s=%08x\n",.     
303a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303b0 20 6a 2c 20 73 57 42 49 2e 70 53 72 63 2d 3e 70   j, sWBI.pSrc->p
303c0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
303d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303e0 20 20 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f 73    sWBI.cost.rCos
303f0 74 2c 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61  t, sWBI.cost.pla
30400 6e 2e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  n.nRow,.        
30410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 57                sW
30420 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42  BI.cost.plan.nOB
30430 53 61 74 2c 20 73 57 42 49 2e 63 6f 73 74 2e 70  Sat, sWBI.cost.p
30440 6c 61 6e 2e 77 73 46 6c 61 67 73 29 29 3b 0a 20  lan.wsFlags));. 
30450 20 20 20 20 20 20 20 20 20 62 65 73 74 50 6c 61           bestPla
30460 6e 20 3d 20 73 57 42 49 2e 63 6f 73 74 3b 0a 20  n = sWBI.cost;. 
30470 20 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d           bestJ =
30480 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   j;.        }.  
30490 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52        if( doNotR
304a0 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a  eorder ) break;.
304b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
304c0 20 20 61 73 73 65 72 74 28 20 62 65 73 74 4a 3e    assert( bestJ>
304d0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
304e0 28 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 20  ( sWBI.notValid 
304f0 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  & getMask(pMaskS
30500 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
30510 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20  bestJ].iCursor) 
30520 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  );.    WHERETRAC
30530 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
30540 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20  r selects table 
30550 25 64 20 28 25 73 29 20 66 6f 72 20 6c 6f 6f 70  %d (%s) for loop
30560 20 25 64 20 77 69 74 68 3a 5c 6e 22 0a 20 20 20   %d with:\n".   
30570 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
30580 20 20 63 6f 73 74 3d 25 2e 31 66 2c 20 6e 52 6f    cost=%.1f, nRo
30590 77 3d 25 2e 31 66 2c 20 6e 4f 42 53 61 74 3d 25  w=%.1f, nOBSat=%
305a0 64 2c 20 77 73 46 6c 61 67 73 3d 30 78 25 30 38  d, wsFlags=0x%08
305b0 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
305c0 20 20 20 20 20 20 62 65 73 74 4a 2c 20 70 54 61        bestJ, pTa
305d0 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
305e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
305f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
30600 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 2c 20 62  vel-pWInfo->a, b
30610 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 2c 20 62  estPlan.rCost, b
30620 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f  estPlan.plan.nRo
30630 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
30640 20 20 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e     bestPlan.plan
30650 2e 6e 4f 42 53 61 74 2c 20 62 65 73 74 50 6c 61  .nOBSat, bestPla
30660 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29 29  n.plan.wsFlags))
30670 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 50  ;.    if( (bestP
30680 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
30690 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
306a0 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  T)!=0 ){.      a
306b0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65  ssert( pWInfo->e
306c0 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20  Distinct==0 );. 
306d0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
306e0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
306f0 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
30700 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c  .    }.    andFl
30710 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e  ags &= bestPlan.
30720 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20  plan.wsFlags;.  
30730 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d    pLevel->plan =
30740 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a   bestPlan.plan;.
30750 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
30760 43 75 72 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Cur = pTabList->
30770 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72  a[bestJ].iCursor
30780 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
30790 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
307a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
307b0 44 45 58 45 44 20 29 3b 0a 20 20 20 20 74 65 73  DEXED );.    tes
307c0 74 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e  tcase( bestPlan.
307d0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
307e0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20  HERE_TEMP_INDEX 
307f0 29 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74 50  );.    if( bestP
30800 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
30810 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45   & (WHERE_INDEXE
30820 44 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  D|WHERE_TEMP_IND
30830 45 58 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  EX) ){.      if(
30840 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
30850 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
30860 4c 59 29 20 0a 20 20 20 20 20 20 20 26 26 20 28  LY) .       && (
30870 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
30880 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
30890 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 0a 20 20  MP_INDEX)==0 .  
308a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
308b0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
308c0 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
308d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
308e0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
308f0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
30900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30910 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
30920 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a  ->iIdxCur = -1;.
30930 20 20 20 20 7d 0a 20 20 20 20 73 57 42 49 2e 6e      }.    sWBI.n
30940 6f 74 56 61 6c 69 64 20 26 3d 20 7e 67 65 74 4d  otValid &= ~getM
30950 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
30960 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
30970 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  .iCursor);.    p
30980 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28  Level->iFrom = (
30990 75 38 29 62 65 73 74 4a 3b 0a 20 20 20 20 69 66  u8)bestJ;.    if
309a0 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
309b0 6e 52 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20  nRow>=(double)1 
309c0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
309d0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2a 3d 20 62  >nQueryLoop *= b
309e0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f  estPlan.plan.nRo
309f0 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  w;.    }..    /*
30a00 20 43 68 65 63 6b 20 74 68 61 74 20 69 66 20 74   Check that if t
30a10 68 65 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64  he table scanned
30a20 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74   by this loop it
30a30 65 72 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20  eration had an. 
30a40 20 20 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59     ** INDEXED BY
30a50 20 63 6c 61 75 73 65 20 61 74 74 61 63 68 65 64   clause attached
30a60 20 74 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65   to it, that the
30a70 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20   named index is 
30a80 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65  being.    ** use
30a90 64 20 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20  d for the scan. 
30aa0 49 66 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65  If not, then que
30ab0 72 79 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68  ry compilation h
30ac0 61 73 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a  as failed..    *
30ad0 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
30ae0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  r..    */.    pI
30af0 64 78 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  dx = pTabList->a
30b00 5b 62 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a  [bestJ].pIndex;.
30b10 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
30b20 20 20 20 20 20 20 69 66 28 20 28 62 65 73 74 50        if( (bestP
30b30 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
30b40 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
30b50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
30b60 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
30b70 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
30b80 75 73 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  use index: %s", 
30b90 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
30ba0 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
30bb0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
30bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30bd0 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45   /* If an INDEXE
30be0 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 75  D BY clause is u
30bf0 73 65 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64  sed, the bestInd
30c00 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  ex() function is
30c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
30c20 61 6e 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74  anteed to find t
30c30 68 65 20 69 6e 64 65 78 20 73 70 65 63 69 66 69  he index specifi
30c40 65 64 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45  ed in the INDEXE
30c50 44 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  D BY clause.    
30c60 20 20 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e      ** if it fin
30c70 64 20 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c  d an index at al
30c80 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  l. */.        as
30c90 73 65 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70  sert( bestPlan.p
30ca0 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78  lan.u.pIdx==pIdx
30cb0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
30cc0 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
30cd0 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
30ce0 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
30cf0 6e 22 29 29 3b 0a 20 20 69 66 28 20 70 50 61 72  n"));.  if( pPar
30d00 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
30d10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
30d20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
30d30 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ginError;.  }.  
30d40 69 66 28 20 6e 54 61 62 4c 69 73 74 20 29 7b 0a  if( nTabList ){.
30d50 20 20 20 20 70 4c 65 76 65 6c 2d 2d 3b 0a 20 20      pLevel--;.  
30d60 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
30d70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
30d80 6e 4f 42 53 61 74 3b 0a 20 20 7d 65 6c 73 65 7b  nOBSat;.  }else{
30d90 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  .    pWInfo->nOB
30da0 53 61 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Sat = 0;.  }..  
30db0 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20  /* If the total 
30dc0 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63  query only selec
30dd0 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c  ts a single row,
30de0 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20   then the ORDER 
30df0 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69  BY.  ** clause i
30e00 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20  s irrelevant..  
30e10 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61  */.  if( (andFla
30e20 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55  gs & WHERE_UNIQU
30e30 45 29 21 3d 30 20 26 26 20 70 4f 72 64 65 72 42  E)!=0 && pOrderB
30e40 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
30e50 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20   nTabList==0 || 
30e60 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
30e70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c  Flags & WHERE_AL
30e80 4c 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 3b 0a  L_UNIQUE)!=0 );.
30e90 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
30ea0 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
30eb0 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Expr;.  }..  /* 
30ec0 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
30ed0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
30ee0 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
30ef0 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
30f00 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
30f10 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
30f20 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
30f30 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
30f40 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
30f50 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
30f60 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
30f70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
30f80 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
30f90 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
30fa0 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
30fb0 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
30fc0 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
30fd0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
30fe0 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
30ff0 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
31000 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
31010 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
31020 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
31030 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67  )!=0 && (andFlag
31040 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
31050 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e  )!=0 ){.    pWIn
31060 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20  fo->okOnePass = 
31070 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
31080 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  [0].plan.wsFlags
31090 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
310a0 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  NLY;.  }..  /* O
310b0 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
310c0 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
310d0 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
310e0 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
310f0 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
31100 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
31110 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
31120 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
31130 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
31140 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
31150 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74  er Goto */.  not
31160 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
31170 6b 29 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  k)0;.  pWInfo->n
31180 52 6f 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65  RowOut = (double
31190 29 31 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20  )1;.  for(ii=0, 
311a0 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
311b0 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
311c0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
311d0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
311e0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
311f0 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
31200 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
31210 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
31220 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
31230 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
31240 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
31250 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a  item *pTabItem;.
31260 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
31270 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
31280 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
31290 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d   pTab = pTabItem
312a0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 70 57 49 6e  ->pTab;.    pWIn
312b0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70  fo->nRowOut *= p
312c0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77  Level->plan.nRow
312d0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
312e0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
312f0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
31300 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  ma);.    if( (pT
31310 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
31320 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
31330 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
31340 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
31350 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
31360 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
31370 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
31380 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
31390 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
313a0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
313b0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
313c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
313d0 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
313e0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
313f0 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
31400 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
31410 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
31420 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
31430 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
31440 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
31450 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
31460 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
31470 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
31480 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
31490 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
314a0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
314b0 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
314c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
314d0 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
314e0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
314f0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
31500 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
31510 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
31520 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
31530 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
31540 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
31550 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
31560 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74   op);.      test
31570 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  case( pTab->nCol
31580 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
31590 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d   testcase( pTab-
315a0 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
315b0 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
315c0 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
315d0 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a  ab->nCol<BMS ){.
315e0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
315f0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
31600 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
31610 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
31620 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
31630 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
31640 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
31650 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
31660 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
31670 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
31680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31690 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
316a0 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
316b0 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
316c0 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
316d0 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
316e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
316f0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
31700 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
31710 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
31720 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  >zName);.    }.#
31730 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31740 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
31750 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
31760 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
31770 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
31780 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
31790 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
317a0 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
317b0 20 73 57 42 49 2e 70 57 43 2c 20 70 54 61 62 49   sWBI.pWC, pTabI
317c0 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  tem, notReady, p
317d0 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  Level);.    }els
317e0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
317f0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
31800 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
31810 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20  NDEXED)!=0 ){.  
31820 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
31830 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
31840 70 49 64 78 3b 0a 20 20 20 20 20 20 4b 65 79 49  pIdx;.      KeyI
31850 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  nfo *pKey = sqli
31860 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
31870 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20  pParse, pIx);.  
31880 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75      int iIndexCu
31890 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
318a0 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Cur;.      asser
318b0 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
318c0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
318d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
318e0 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a  iIndexCur>=0 );.
318f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31900 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
31910 65 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75  enRead, iIndexCu
31920 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
31930 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
31940 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
31950 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
31960 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
31970 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
31980 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
31990 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
319a0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
319b0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
319c0 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65   iDb);.    notRe
319d0 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
319e0 73 57 42 49 2e 70 57 43 2d 3e 70 4d 61 73 6b 53  sWBI.pWC->pMaskS
319f0 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
31a00 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57  ursor);.  }.  pW
31a10 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
31a20 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
31a30 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
31a40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
31a50 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
31a60 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
31a70 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
31a80 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
31a90 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
31aa0 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
31ab0 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
31ac0 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
31ad0 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
31ae0 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
31af0 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
31b00 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
31b10 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
31b20 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
31b30 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70  st; ii++){.    p
31b40 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
31b50 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c  >a[ii];.    expl
31b60 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73  ainOneScan(pPars
31b70 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  e, pTabList, pLe
31b80 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d  vel, ii, pLevel-
31b90 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61  >iFrom, wctrlFla
31ba0 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  gs);.    notRead
31bb0 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  y = codeOneLoopS
31bc0 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
31bd0 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74   wctrlFlags, not
31be0 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e  Ready);.    pWIn
31bf0 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
31c00 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
31c10 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
31c20 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f  LITE_TEST  /* Fo
31c30 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
31c40 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
31c50 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20   */.  /* Record 
31c60 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  in the query pla
31c70 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
31c80 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  out the current 
31c90 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74  table.  ** and t
31ca0 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  he index used to
31cb0 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61   access it (if a
31cc0 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62  ny).  If the tab
31cd0 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  le itself.  ** i
31ce0 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20  s not used, its 
31cf0 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d  name is just '{}
31d00 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20  '.  If no index 
31d10 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65  is used.  ** the
31d20 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64   index is listed
31d30 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68   as "{}".  If th
31d40 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
31d50 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69   used the.  ** i
31d60 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27  ndex name is '*'
31d70 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
31d80 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
31d90 69 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20  ii++){.    char 
31da0 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  *z;.    int n;. 
31db0 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 73 74     int w;.    st
31dc0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
31dd0 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20  m *pTabItem;..  
31de0 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
31df0 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77  fo->a[ii];.    w
31e00 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
31e10 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 54 61  wsFlags;.    pTa
31e20 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
31e30 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
31e40 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61  om];.    z = pTa
31e50 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  bItem->zAlias;. 
31e60 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
31e70 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
31e80 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d  ->zName;.    n =
31e90 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
31ea0 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e  (z);.    if( n+n
31eb0 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
31ec0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
31ed0 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69  n)-10 ){.      i
31ee0 66 28 20 28 77 20 26 20 57 48 45 52 45 5f 49 44  f( (w & WHERE_ID
31ef0 58 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 28 77  X_ONLY)!=0 && (w
31f00 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f 53   & WHERE_COVER_S
31f10 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  CAN)==0 ){.     
31f20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
31f30 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
31f40 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b  Plan], "{}", 2);
31f50 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
31f60 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
31f70 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  e{.        memcp
31f80 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
31f90 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
31fa0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
31fb0 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
31fc0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
31fd0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
31fe0 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
31ff0 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
32000 20 77 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44   w & WHERE_ROWID
32010 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _EQ );.    testc
32020 61 73 65 28 20 77 20 26 20 57 48 45 52 45 5f 52  ase( w & WHERE_R
32030 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20  OWID_RANGE );.  
32040 20 20 69 66 28 20 77 20 26 20 28 57 48 45 52 45    if( w & (WHERE
32050 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
32060 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
32070 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
32080 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
32090 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20  [nQPlan], "* ", 
320a0 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  2);.      nQPlan
320b0 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65   += 2;.    }else
320c0 20 69 66 28 20 28 77 20 26 20 57 48 45 52 45 5f   if( (w & WHERE_
320d0 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 28  INDEXED)!=0 && (
320e0 77 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f  w & WHERE_COVER_
320f0 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SCAN)==0 ){.    
32100 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
32110 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c  len30(pLevel->pl
32120 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
32130 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e  );.      if( n+n
32140 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
32150 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
32160 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n)-2 ){.        
32170 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
32180 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
32190 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  n], pLevel->plan
321a0 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  .u.pIdx->zName, 
321b0 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
321c0 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  an += n;.       
321d0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
321e0 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
321f0 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
32200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
32210 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
32220 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
32230 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20  , "{} ", 3);.   
32240 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
32250 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
32260 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73  e( nQPlan>0 && s
32270 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
32280 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27  n[nQPlan-1]==' '
32290 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
322a0 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50  query_plan[--nQP
322b0 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lan] = 0;.  }.  
322c0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
322d0 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  an[nQPlan] = 0;.
322e0 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65    nQPlan = 0;.#e
322f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
32300 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61  EST // Testing a
32310 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
32320 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52   only */..  /* R
32330 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e  ecord the contin
32340 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69  uation address i
32350 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  n the WhereInfo 
32360 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e  structure.  Then
32370 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61  .  ** clean up a
32380 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
32390 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
323a0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
323b0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
323c0 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
323d0 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
323e0 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
323f0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
32400 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
32410 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
32420 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
32430 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
32440 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
32450 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
32460 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
32470 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
32480 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
32490 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
324a0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
324b0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
324c0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
324d0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
324e0 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
324f0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
32500 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
32510 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
32520 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
32530 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
32540 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
32550 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
32560 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
32570 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
32580 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
32590 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
325a0 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
325b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
325c0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
325d0 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
325e0 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
325f0 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
32600 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
32610 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
32620 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
32630 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
32640 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
32650 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
32660 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32670 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
32680 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
32690 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
326a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
326b0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
326c0 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
326d0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
326e0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
326f0 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
32700 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
32710 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
32720 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
32730 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
32740 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32750 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
32760 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
32770 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
32780 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
32790 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
327a0 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
327b0 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
327c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
327d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
327e0 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
327f0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
32800 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
32810 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e  , OP_Next, pIn->
32820 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
32830 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73  nTop);.        s
32840 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
32850 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
32860 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
32870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
32880 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
32890 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
328a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
328b0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
328c0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
328d0 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
328e0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
328f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
32900 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
32910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32920 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
32930 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
32940 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
32950 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
32960 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
32970 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
32980 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76          || (pLev
32990 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
329a0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
329b0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
329c0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
329d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
329e0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
329f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
32a00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
32a10 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
32a20 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
32a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32a40 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
32a50 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
32a60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32a70 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
32a80 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
32a90 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
32aa0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
32ab0 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
32ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
32ad0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
32ae0 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
32af0 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
32b00 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
32b10 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
32b20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
32b30 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
32b40 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
32b50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
32b60 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
32b70 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
32b80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
32b90 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
32ba0 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
32bb0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
32bc0 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
32bd0 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
32be0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
32bf0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
32c00 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
32c10 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
32c20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
32c30 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
32c40 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
32c50 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
32c60 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
32c70 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==1 || pWInfo->n
32c80 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d  Level==pTabList-
32c90 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
32ca0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
32cb0 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
32cc0 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
32cd0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65  vel++){.    Inde
32ce0 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
32cf0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
32d00 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
32d10 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
32d20 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
32d30 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
32d40 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
32d50 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
32d60 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
32d70 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
32d80 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
32d90 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e  0.     && pTab->
32da0 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20  pSelect==0.     
32db0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
32dc0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
32dd0 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
32de0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
32df0 69 6e 74 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d  int ws = pLevel-
32e00 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  >plan.wsFlags;. 
32e10 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
32e20 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28  ->okOnePass && (
32e30 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
32e40 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
32e50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32e60 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
32e70 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
32e80 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
32e90 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
32ea0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
32eb0 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 54  && (ws & WHERE_T
32ec0 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b  EMP_INDEX)==0 ){
32ed0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32ee0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
32ef0 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
32f00 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
32f10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
32f20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
32f30 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
32f40 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69   code substituti
32f50 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61  ons to read data
32f60 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
32f70 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72   index in prefer
32f80 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c  ence to the tabl
32f90 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68  e. Sometimes, th
32fa0 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
32fb0 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e  the table need n
32fc0 65 76 65 72 20 62 65 20 72 65 61 64 20 66 72 6f  ever be read fro
32fd0 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70 65 72  m. This is a per
32fe0 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a  formance boost,.
32ff0 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64      ** as the vd
33000 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75  be level waits u
33010 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69  ntil the table i
33020 73 20 72 65 61 64 20 62 65 66 6f 72 65 20 61 63  s read before ac
33030 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65  tually.    ** se
33040 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  eking the table 
33050 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65  cursor to the re
33060 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69  cord correspondi
33070 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
33080 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f  t.    ** positio
33090 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  n in the index..
330a0 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
330b0 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
330c0 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
330d0 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
330e0 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
330f0 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
33100 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
33110 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
33120 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
33130 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
33140 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
33150 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
33160 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
33170 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
33180 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
33190 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
331a0 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
331b0 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
331c0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
331d0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
331e0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
331f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
33200 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
33210 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
33220 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
33230 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
33240 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
33250 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
33260 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
33270 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
33280 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
33290 20 20 69 66 28 20 70 49 64 78 20 26 26 20 21 64    if( pIdx && !d
332a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
332b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a  {.      int k, j
332c0 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64  , last;.      Vd
332d0 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20  beOp *pOp;..    
332e0 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
332f0 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e  dbeGetOp(v, pWIn
33300 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20  fo->iTop);.     
33310 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
33320 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
33330 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  );.      for(k=p
33340 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c  WInfo->iTop; k<l
33350 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
33360 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
33370 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
33380 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
33390 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
333a0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
333b0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
333c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
333d0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
333e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
333f0 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78  f( pOp->p2==pIdx
33400 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b  ->aiColumn[j] ){
33410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
33420 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20  Op->p2 = j;.    
33430 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
33440 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
33450 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Cur;.           
33460 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
33470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33480 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
33490 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70  sert( (pLevel->p
334a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
334b0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
334c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
334d0 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  || j<pIdx->nColu
334e0 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  mn );.        }e
334f0 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
33500 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b  ode==OP_Rowid ){
33510 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
33520 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
33530 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
33540 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
33550 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20  _IdxRowid;.     
33560 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33570 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
33580 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
33590 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
335a0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
335b0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
335c0 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
335d0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
335e0 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.