/ Hex Artifact Content
Login

Artifact 979868386da8fa8e50d74bde97216849add43db2:


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 28 65  nformation if (e
10c0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
10d0: 29 21 3d 30 20 2a 2f 0a 20 20 20 20 57 68 65 72  )!=0 */.    Wher
10e0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
10f0: 66 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66  fo; /* Extra inf
1100: 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70  ormation if (eOp
1110: 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21  erator& WO_AND)!
1120: 3d 30 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75  =0 */.  } u;.  u
1130: 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  16 eOperator;   
1140: 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78         /* A WO_x
1150: 78 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69  x value describi
1160: 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20  ng <op> */.  u8 
1170: 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wtFlags;        
1180: 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78       /* TERM_xxx
1190: 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65   bit flags.  See
11a0: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e   below */.  u8 n
11b0: 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
11c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11d0: 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d   children that m
11e0: 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a  ust disable us *
11f0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
1200: 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54  *pWC;       /* T
1210: 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74  he clause this t
1220: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a  erm is part of *
1230: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
1240: 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42  eqRight;    /* B
1250: 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  itmask of tables
1260: 20 75 73 65 64 20 62 79 20 70 45 78 70 72 2d 3e   used by pExpr->
1270: 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d  pRight */.  Bitm
1280: 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20  ask prereqAll;  
1290: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
12a0: 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  f tables referen
12b0: 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a  ced by pExpr */.
12c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
12d0: 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72  d values of Wher
12e0: 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f  eTerm.wtFlags.*/
12f0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59  .#define TERM_DY
1300: 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20 20  NAMIC    0x01   
1310: 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20  /* Need to call 
1320: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1330: 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a  e(db, pExpr) */.
1340: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52  #define TERM_VIR
1350: 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f  TUAL    0x02   /
1360: 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20 6f  * Added by the o
1370: 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f  ptimizer.  Do no
1380: 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e  t code */.#defin
1390: 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20  e TERM_CODED    
13a0: 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73    0x04   /* This
13b0: 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79   term is already
13c0: 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e   coded */.#defin
13d0: 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20  e TERM_COPIED   
13e0: 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20    0x08   /* Has 
13f0: 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69  a child */.#defi
1400: 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20  ne TERM_ORINFO  
1410: 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65 65     0x10   /* Nee
1420: 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68  d to free the Wh
1430: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
1440: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66  o object */.#def
1450: 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  ine TERM_ANDINFO
1460: 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e 65      0x20   /* Ne
1470: 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57  ed to free the W
1480: 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49  hereTerm.u.pAndI
1490: 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69  nfo obj */.#defi
14a0: 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20  ne TERM_OR_OK   
14b0: 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73 65     0x40   /* Use
14c0: 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75  d during OR-clau
14d0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  se processing */
14e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14f0: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 23 20 20 64  NABLE_STAT3.#  d
1500: 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  efine TERM_VNULL
1510: 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61      0x80   /* Ma
1520: 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c  nufactured x>NUL
1530: 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72  L or x<=NULL ter
1540: 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65  m */.#else.#  de
1550: 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  fine TERM_VNULL 
1560: 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73     0x00   /* Dis
1570: 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69  abled if not usi
1580: 6e 67 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64  ng stat3 */.#end
1590: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
15a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
15b0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
15c0: 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72   holds all infor
15d0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
15e0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  * WHERE clause. 
15f0: 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20   Mostly this is 
1600: 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  a container for 
1610: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72  one or more Wher
1620: 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 45 78  eTerms..**.** Ex
1630: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70 4f 75  planation of pOu
1640: 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48 45 52  ter:  For a WHER
1650: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
1660: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
1670: 20 20 20 20 20 61 20 41 4e 44 20 28 28 62 20 41       a AND ((b A
1680: 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e 44 20  ND c) OR (d AND 
1690: 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a 2a 20  e)) AND f.**.** 
16a0: 54 68 65 72 65 20 61 72 65 20 73 65 70 61 72 61  There are separa
16b0: 74 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  te WhereClause o
16c0: 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65 20 77  bjects for the w
16d0: 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e 64 20  hole clause and 
16e0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62 63 6c  for.** the subcl
16f0: 61 75 73 65 73 20 22 28 62 20 41 4e 44 20 63 29  auses "(b AND c)
1700: 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20 65 29  " and "(d AND e)
1710: 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72 20 66  ".  The pOuter f
1720: 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 73  ield of the.** s
1730: 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e 74 73  ubclauses points
1740: 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61   to the WhereCla
1750: 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  use object for t
1760: 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 2e  he whole clause.
1770: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
1780: 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65  Clause {.  Parse
1790: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
17a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
17b0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  r context */.  W
17c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
17d0: 73 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70 70 69  skSet;  /* Mappi
17e0: 6e 67 20 6f 66 20 74 61 62 6c 65 20 63 75 72 73  ng of table curs
17f0: 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69  or numbers to bi
1800: 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72  tmasks */.  Wher
1810: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1820: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1830: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1840: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1850: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
1860: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
1870: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
1880: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
1890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18a0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18b0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
18c0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
18d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18e0: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
18f0: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1900: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1910: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1920: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1930: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1940: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1950: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1960: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1970: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
1980: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
1990: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19a0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19b0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
19c0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
19d0: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
19e0: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
19f0: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a00: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a10: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a30: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a40: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a50: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1a60: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1a70: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1a80: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1a90: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1aa0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1ab0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1ac0: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1ad0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1ae0: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1af0: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b00: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b10: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b20: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b30: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b40: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b50: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1b60: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1b70: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1b80: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1b90: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1ba0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bb0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1bc0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1bd0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1be0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1bf0: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c00: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c10: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c20: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c30: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c40: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1c60: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1c70: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1c80: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1c90: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ca0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cb0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1cc0: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1cd0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1ce0: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1cf0: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d00: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d10: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d20: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d30: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d40: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d50: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1d60: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1d70: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1d80: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1d90: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1da0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1db0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1dc0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1dd0: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1de0: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1df0: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e00: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e10: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e20: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e30: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e40: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e50: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1e60: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1e70: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1e80: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1e90: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ea0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1eb0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1ec0: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1ed0: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1ef0: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f00: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f10: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f20: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f30: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f40: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f50: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1f60: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1f70: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1f80: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1f90: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fa0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1fb0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1fc0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1fd0: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1fe0: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1ff0: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2000: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2010: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2020: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2030: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2040: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2050: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
2060: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
2070: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
2080: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
2090: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20a0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20b0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
20c0: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
20d0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
20e0: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
20f0: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2100: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2110: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2120: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2130: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2140: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2170: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
2180: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
2190: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21b0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
21c0: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
21d0: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
21e0: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
21f0: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2200: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2210: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2220: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2230: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2240: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2250: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
2260: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
2270: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2280: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
2290: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22a0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22b0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
22c0: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
22d0: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
22e0: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
22f0: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2300: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2310: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2320: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2330: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2340: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2350: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
2360: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
2370: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
2380: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
2390: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23a0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
23c0: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
23d0: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
23e0: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
23f0: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2400: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2410: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2420: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2430: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2440: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2450: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
2460: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
2470: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
2480: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2490: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24a0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24b0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
24c0: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
24d0: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
24e0: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
24f0: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2500: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2510: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2520: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2530: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2540: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49 56  #define WO_EQUIV
2550: 20 20 30 78 34 30 30 20 20 20 20 20 20 20 2f 2a    0x400       /*
2560: 20 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d   Of the form A==
2570: 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20  B, both columns 
2580: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
2590: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
25a0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
25b0: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
25c0: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
25d0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
25e0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
25f0: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2600: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2610: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2620: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2630: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2640: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2650: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2660: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2670: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2680: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
2690: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
26a0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
26b0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
26c0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
26d0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
26e0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
26f0: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2700: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2710: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2720: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2730: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2740: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2750: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2760: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2770: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2780: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
2790: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
27a0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
27b0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
27c0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
27d0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
27e0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
27f0: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2800: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2810: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2820: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2830: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2840: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2850: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2860: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2870: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2880: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
2890: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
28a0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
28b0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
28c0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
28d0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
28e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
28f0: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2900: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2910: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2920: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2930: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2940: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2950: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2960: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2970: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2980: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2990: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
29a0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
29b0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
29c0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
29d0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
29e0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
29f0: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2a00: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2a10: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2a20: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2a30: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2a40: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2a50: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2a60: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2a70: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2a80: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
2a90: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
2aa0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
2ab0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
2ac0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
2ad0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
2ae0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2af0: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2b00: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2b10: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2b20: 45 20 20 20 20 20 20 30 78 30 38 30 66 31 30 30  E      0x080f100
2b30: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2b40: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2b50: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2b60: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2b70: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2b80: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
2b90: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
2ba0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2bb0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
2bc0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
2bd0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
2be0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2bf0: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2c00: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2c10: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2c20: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2c30: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2c40: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 34  X_ONLY     0x004
2c50: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2c60: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2c70: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2c80: 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 20 20   WHERE_ORDERED  
2c90: 20 20 20 20 30 78 30 30 38 30 30 30 30 30 20 20      0x00800000  
2ca0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2cb0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2cc0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2cd0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2ce0: 20 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20       0x01000000 
2cf0: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2d00: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2d10: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2d20: 45 20 20 20 20 20 20 20 30 78 30 32 30 30 30 30  E       0x020000
2d30: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2d40: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2d50: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2d60: 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20  HERE_ALL_UNIQUE 
2d70: 20 20 30 78 30 34 30 30 30 30 30 30 20 20 2f 2a    0x04000000  /*
2d80: 20 54 68 69 73 20 61 6e 64 20 61 6c 6c 20 70 72   This and all pr
2d90: 69 6f 72 20 68 61 76 65 20 6f 6e 65 20 72 6f 77  ior have one row
2da0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2db0: 45 5f 4f 42 5f 55 4e 49 51 55 45 20 20 20 20 30  E_OB_UNIQUE    0
2dc0: 78 30 30 30 30 34 30 30 30 20 20 2f 2a 20 56 61  x00004000  /* Va
2dd0: 6c 75 65 73 20 69 6e 20 4f 52 44 45 52 20 42 59  lues in ORDER BY
2de0: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 0a 20 20   columns are .  
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e       ** differen
2e20: 74 20 66 6f 72 20 65 76 65 72 79 20 6f 75 74 70  t for every outp
2e30: 75 74 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e  ut row */.#defin
2e40: 65 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  e WHERE_VIRTUALT
2e50: 41 42 4c 45 20 30 78 30 38 30 30 30 30 30 30 20  ABLE 0x08000000 
2e60: 20 2f 2a 20 55 73 65 20 76 69 72 74 75 61 6c 2d   /* Use virtual-
2e70: 74 61 62 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  table processing
2e80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2e90: 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20 20 20 30  E_MULTI_OR     0
2ea0: 78 31 30 30 30 30 30 30 30 20 20 2f 2a 20 4f 52  x10000000  /* OR
2eb0: 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20   using multiple 
2ec0: 69 6e 64 69 63 65 73 20 2a 2f 0a 23 64 65 66 69  indices */.#defi
2ed0: 6e 65 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e  ne WHERE_TEMP_IN
2ee0: 44 45 58 20 20 20 30 78 32 30 30 30 30 30 30 30  DEX   0x20000000
2ef0: 20 20 2f 2a 20 55 73 65 73 20 61 6e 20 65 70 68    /* Uses an eph
2f00: 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  emeral index */.
2f10: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 44 49  #define WHERE_DI
2f20: 53 54 49 4e 43 54 20 20 20 20 20 30 78 34 30 30  STINCT     0x400
2f30: 30 30 30 30 30 20 20 2f 2a 20 43 6f 72 72 65 63  00000  /* Correc
2f40: 74 20 6f 72 64 65 72 20 66 6f 72 20 44 49 53 54  t order for DIST
2f50: 49 4e 43 54 20 2a 2f 0a 23 64 65 66 69 6e 65 20  INCT */.#define 
2f60: 57 48 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e  WHERE_COVER_SCAN
2f70: 20 20 20 30 78 38 30 30 30 30 30 30 30 20 20 2f     0x80000000  /
2f80: 2a 20 46 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61  * Full scan of a
2f90: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
2fa0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  */../*.** This m
2fb0: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6d  odule contains m
2fc0: 61 6e 79 20 73 65 70 61 72 61 74 65 20 73 75 62  any separate sub
2fd0: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 77 6f  routines that wo
2fe0: 72 6b 20 74 6f 67 65 74 68 65 72 20 74 6f 0a 2a  rk together to.*
2ff0: 2a 20 66 69 6e 64 20 74 68 65 20 62 65 73 74 20  * find the best 
3000: 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 20 66  indices to use f
3010: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70  or accessing a p
3020: 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20  articular table 
3030: 69 6e 20 61 20 71 75 65 72 79 2e 0a 2a 2a 20 41  in a query..** A
3040: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3050: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3060: 63 74 75 72 65 20 68 6f 6c 64 73 20 63 6f 6e 74  cture holds cont
3070: 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ext information 
3080: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 69 6e 64  about the.** ind
3090: 65 78 20 73 65 61 72 63 68 20 73 6f 20 74 68 61  ex search so tha
30a0: 74 20 69 74 20 63 61 6e 20 62 65 20 6d 6f 72 65  t it can be more
30b0: 20 65 61 73 69 6c 79 20 70 61 73 73 65 64 20 62   easily passed b
30c0: 65 74 77 65 65 6e 20 74 68 65 20 76 61 72 69 6f  etween the vario
30d0: 75 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2e 0a  us.** routines..
30e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
30f0: 74 20 57 68 65 72 65 42 65 73 74 49 64 78 20 57  t WhereBestIdx W
3100: 68 65 72 65 42 65 73 74 49 64 78 3b 0a 73 74 72  hereBestIdx;.str
3110: 75 63 74 20 57 68 65 72 65 42 65 73 74 49 64 78  uct WhereBestIdx
3120: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
3130: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
3140: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
3150: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
3160: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
3170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3180: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3190: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
31a0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
31b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
31c0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
31d0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
31e0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
3200: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e  ask of cursors n
3210: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
3220: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c    Bitmask notVal
3230: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3240: 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74    /* Cursors not
3250: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
3260: 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20  ny purpose */.  
3270: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
3280: 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
3290: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
32a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
32b0: 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 3b  List *pDistinct;
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32d0: 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69  he select-list i
32e0: 66 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49  f query is DISTI
32f0: 4e 43 54 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  NCT */.  sqlite3
3300: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70  _index_info **pp
3310: 49 64 78 49 6e 66 6f 3b 20 2f 2a 20 49 6e 64 65  IdxInfo; /* Inde
3320: 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  x information pa
3330: 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64  ssed to xBestInd
3340: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6e  ex */.  int i, n
3350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3360: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
3370: 20 6c 6f 6f 70 20 69 73 20 62 65 69 6e 67 20 63   loop is being c
3380: 6f 64 65 64 3b 20 23 20 6f 66 20 6c 6f 6f 70 73  oded; # of loops
3390: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
33a0: 20 2a 61 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *aLevel;       
33b0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62        /* Info ab
33c0: 6f 75 74 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20  out outer loops 
33d0: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 63  */.  WhereCost c
33e0: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
33f0: 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63       /* Lowest c
3400: 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  ost query plan *
3410: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  /.};../*.** Retu
3420: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
3430: 72 6f 62 65 20 63 6f 73 74 20 69 73 20 6c 65 73  robe cost is les
3440: 73 20 74 68 61 6e 20 74 68 65 20 62 61 73 65 6c  s than the basel
3450: 69 6e 65 20 63 6f 73 74 0a 2a 2f 0a 73 74 61 74  ine cost.*/.stat
3460: 69 63 20 69 6e 74 20 63 6f 6d 70 61 72 65 43 6f  ic int compareCo
3470: 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 43 6f  st(const WhereCo
3480: 73 74 20 2a 70 50 72 6f 62 65 2c 20 63 6f 6e 73  st *pProbe, cons
3490: 74 20 57 68 65 72 65 43 6f 73 74 20 2a 70 42 61  t WhereCost *pBa
34a0: 73 65 6c 69 6e 65 29 7b 0a 20 20 69 66 28 20 70  seline){.  if( p
34b0: 50 72 6f 62 65 2d 3e 72 43 6f 73 74 3c 70 42 61  Probe->rCost<pBa
34c0: 73 65 6c 69 6e 65 2d 3e 72 43 6f 73 74 20 29 20  seline->rCost ) 
34d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
34e0: 70 50 72 6f 62 65 2d 3e 72 43 6f 73 74 3e 70 42  pProbe->rCost>pB
34f0: 61 73 65 6c 69 6e 65 2d 3e 72 43 6f 73 74 20 29  aseline->rCost )
3500: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
3510: 20 70 50 72 6f 62 65 2d 3e 70 6c 61 6e 2e 6e 4f   pProbe->plan.nO
3520: 42 53 61 74 3e 70 42 61 73 65 6c 69 6e 65 2d 3e  BSat>pBaseline->
3530: 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 29 20 72 65  plan.nOBSat ) re
3540: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 50  turn 1;.  if( pP
3550: 72 6f 62 65 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3c  robe->plan.nRow<
3560: 70 42 61 73 65 6c 69 6e 65 2d 3e 70 6c 61 6e 2e  pBaseline->plan.
3570: 6e 52 6f 77 20 29 20 72 65 74 75 72 6e 20 31 3b  nRow ) return 1;
3580: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3590: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
35a0: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
35b0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
35c0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
35d0: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
35e0: 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c  eInit(.  WhereCl
35f0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
3600: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c    /* The WhereCl
3610: 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69  ause to be initi
3620: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73  alized */.  Pars
3630: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3640: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
3650: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
3660: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
3670: 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70  MaskSet,  /* Map
3680: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20  ping from table 
3690: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74  cursor numbers t
36a0: 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20  o bitmasks */.  
36b0: 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
36c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68           /* Migh
36d0: 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45 5f  t include WHERE_
36e0: 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  AND_ONLY */.){. 
36f0: 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70   pWC->pParse = p
3700: 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d  Parse;.  pWC->pM
3710: 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65  askSet = pMaskSe
3720: 74 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72  t;.  pWC->pOuter
3730: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65   = 0;.  pWC->nTe
3740: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
3750: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
3760: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
3770: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
3780: 61 53 74 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e  aStatic;.  pWC->
3790: 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
37a0: 72 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 20 46  rlFlags;.}../* F
37b0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
37c0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
37d0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
37e0: 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a  (WhereClause*);.
37f0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
3800: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
3810: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
3820: 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63  hereOrInfo objec
3830: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
3840: 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c  d whereOrInfoDel
3850: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
3860: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29   WhereOrInfo *p)
3870: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
3880: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
3890: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
38a0: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
38b0: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
38c0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
38d0: 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49  with a WhereAndI
38e0: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
38f0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
3900: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  AndInfoDelete(sq
3910: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
3920: 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  AndInfo *p){.  w
3930: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
3940: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
3950: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
3960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
3970: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
3980: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
3990: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
39a0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
39b0: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
39c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
39d0: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
39e0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
39f0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
3a00: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  id whereClauseCl
3a10: 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20  ear(WhereClause 
3a20: 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  *pWC){.  int i;.
3a30: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a    WhereTerm *a;.
3a40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3a50: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
3a60: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
3a70: 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b  erm-1, a=pWC->a;
3a80: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29   i>=0; i--, a++)
3a90: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46  {.    if( a->wtF
3aa0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
3ab0: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIC ){.      sql
3ac0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
3ad0: 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20  b, a->pExpr);.  
3ae0: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77    }.    if( a->w
3af0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
3b00: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
3b10: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
3b20: 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f  db, a->u.pOrInfo
3b30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
3b40: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
3b50: 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20  RM_ANDINFO ){.  
3b60: 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f      whereAndInfo
3b70: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
3b80: 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  pAndInfo);.    }
3b90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e  .  }.  if( pWC->
3ba0: 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  a!=pWC->aStatic 
3bb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
3bc0: 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Free(db, pWC->a)
3bd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3be0: 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  dd a single new 
3bf0: 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20  WhereTerm entry 
3c00: 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  to the WhereClau
3c10: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
3c20: 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54  * The new WhereT
3c30: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
3c40: 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45  nstructed from E
3c50: 78 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77  xpr p and with w
3c60: 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69  tFlags..** The i
3c70: 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d  ndex in pWC->a[]
3c80: 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   of the new Wher
3c90: 65 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65  eTerm is returne
3ca0: 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  d on success..**
3cb0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   0 is returned i
3cc0: 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54  f the new WhereT
3cd0: 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  erm could not be
3ce0: 20 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20   added due to a 
3cf0: 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
3d00: 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  tion error.  The
3d10: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
3d20: 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  on failure will 
3d30: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a  be recorded in.*
3d40: 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  * the db->malloc
3d50: 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74  Failed flag so t
3d60: 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  hat higher-level
3d70: 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64   functions can d
3d80: 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  etect it..**.** 
3d90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
3da0: 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  l increase the s
3db0: 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e  ize of the pWC->
3dc0: 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63  a[] array as nec
3dd0: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
3de0: 20 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67   the wtFlags arg
3df0: 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54  ument includes T
3e00: 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ERM_DYNAMIC, the
3e10: 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  n responsibility
3e20: 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20  .** for freeing 
3e30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
3e40: 20 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74   is assumed by t
3e50: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
3e60: 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68  bject pWC..** Th
3e70: 69 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20  is is true even 
3e80: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
3e90: 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  fails to allocat
3ea0: 65 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72  e a new WhereTer
3eb0: 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  m..**.** WARNING
3ec0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
3ed0: 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65  might reallocate
3ee0: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
3ef0: 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72  to store.** Wher
3f00: 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69  eTerms.  All poi
3f10: 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65  nters to WhereTe
3f20: 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  rms should be in
3f30: 76 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a  validated after.
3f40: 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
3f50: 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70  routine.  Such p
3f60: 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72  ointers may be r
3f70: 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20  einitialized by 
3f80: 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74  referencing.** t
3f90: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
3fa0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
3fb0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
3fc0: 72 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  rt(WhereClause *
3fd0: 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38  pWC, Expr *p, u8
3fe0: 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65   wtFlags){.  Whe
3ff0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
4000: 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74   int idx;.  test
4010: 63 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20  case( wtFlags & 
4020: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
4030: 20 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d   /* EV: R-00211-
4040: 31 35 31 30 30 20 2a 2f 0a 20 20 69 66 28 20 70  15100 */.  if( p
4050: 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e  WC->nTerm>=pWC->
4060: 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65  nSlot ){.    Whe
4070: 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70  reTerm *pOld = p
4080: 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74  WC->a;.    sqlit
4090: 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50  e3 *db = pWC->pP
40a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57  arse->db;.    pW
40b0: 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  C->a = sqlite3Db
40c0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
40d0: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
40e0: 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a  pWC->nSlot*2 );.
40f0: 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d      if( pWC->a==
4100: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  0 ){.      if( w
4110: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  tFlags & TERM_DY
4120: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20  NAMIC ){.       
4130: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4140: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  te(db, p);.     
4150: 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20   }.      pWC->a 
4160: 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65  = pOld;.      re
4170: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
4180: 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c    memcpy(pWC->a,
4190: 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57   pOld, sizeof(pW
41a0: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54  C->a[0])*pWC->nT
41b0: 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  erm);.    if( pO
41c0: 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63  ld!=pWC->aStatic
41d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
41e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64  3DbFree(db, pOld
41f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43  );.    }.    pWC
4200: 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65  ->nSlot = sqlite
4210: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
4220: 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66  , pWC->a)/sizeof
4230: 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d  (pWC->a[0]);.  }
4240: 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  .  pTerm = &pWC-
4250: 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54  >a[idx = pWC->nT
4260: 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d  erm++];.  pTerm-
4270: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
4280: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
4290: 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46  p);.  pTerm->wtF
42a0: 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a  lags = wtFlags;.
42b0: 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70    pTerm->pWC = p
42c0: 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  WC;.  pTerm->iPa
42d0: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74  rent = -1;.  ret
42e0: 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn idx;.}../*.*
42f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4300: 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70  dentifies subexp
4310: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
4320: 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65  WHERE clause whe
4330: 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78  re.** each subex
4340: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
4350: 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44  rated by the AND
4360: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d   operator or som
4370: 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61  e other.** opera
4380: 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  tor specified in
4390: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
43a0: 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  r.  The WhereCla
43b0: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
43c0: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
43d0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65  pointers to sube
43e0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72  xpressions.  For
43f0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
4400: 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65     WHERE  a=='he
4410: 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63  llo' AND coalesc
4420: 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28  e(b,11)<10 AND (
4430: 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32  c+12!=d OR c==22
4440: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c  ).**           \
4450: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
4460: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ______________/ 
4470: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
4480: 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
4490: 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20       slot[0]    
44a0: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20          slot[1] 
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c                sl
44c0: 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ot[2].**.** The 
44d0: 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
44e0: 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69  lause in pExpr i
44f0: 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c  s unaltered.  Al
4500: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  l this routine.*
4510: 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  * does is make s
4520: 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f  lot[] entries po
4530: 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74  int to substruct
4540: 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72  ure within pExpr
4550: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70  ..**.** In the p
4560: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
4570: 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67   and in the diag
4580: 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65  ram, "slot[]" re
4590: 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57  fers to.** the W
45a0: 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61  hereClause.a[] a
45b0: 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b  rray.  The slot[
45c0: 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73  ] array grows as
45d0: 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61   needed to conta
45e0: 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20  in.** all terms 
45f0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
4600: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
4610: 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57  oid whereSplit(W
4620: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
4630: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
4640: 74 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  t op){.  pWC->op
4650: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28   = (u8)op;.  if(
4660: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
4670: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
4680: 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77  >op!=op ){.    w
4690: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
46a0: 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b  (pWC, pExpr, 0);
46b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
46c0: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
46d0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b  xpr->pLeft, op);
46e0: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
46f0: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  pWC, pExpr->pRig
4700: 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ht, op);.  }.}..
4710: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
4720: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
4730: 61 73 6b 20 73 65 74 20 28 61 20 57 68 65 72 65  ask set (a Where
4740: 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a  MaskSet object).
4750: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d  */.#define initM
4760: 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65  askSet(P)  memse
4770: 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(P, 0, sizeof(*
4780: 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  P))../*.** Retur
4790: 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  n the bitmask fo
47a0: 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  r the given curs
47b0: 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  or number.  Retu
47c0: 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73  rn 0 if.** iCurs
47d0: 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  or is not in the
47e0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
47f0: 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28  Bitmask getMask(
4800: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
4810: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
4820: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
4830: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
4840: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
4850: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
4860: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
4870: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
4880: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
4890: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
48a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
48b0: 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69   ((Bitmask)1)<<i
48c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
48d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
48e0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
48f0: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
4900: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
4910: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
4920: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
4930: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
4940: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
4950: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
4960: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
4970: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
4980: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
4990: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
49a0: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
49b0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
49c0: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
49d0: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
49e0: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
49f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
4a00: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
4a10: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
4a20: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
4a30: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
4a40: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
4a50: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
4a60: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
4a70: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
4a80: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
4a90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4aa0: 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76   walks (recursiv
4ab0: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
4ac0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
4ad0: 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61  rates.** a bitma
4ae0: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
4af0: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
4b00: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
4b10: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
4b20: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
4b30: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
4b40: 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c  to work, the cal
4b50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
4b60: 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69  st have.** previ
4b70: 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71  ously invoked sq
4b80: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
4b90: 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65  Names() on the e
4ba0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a  xpression.  See.
4bb0: 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ** the header co
4bc0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
4bd0: 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
4be0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
4bf0: 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
4c00: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
4c10: 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b  () routines look
4c20: 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d  s for column nam
4c30: 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74  es and.** sets t
4c40: 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20  heir opcodes to 
4c50: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
4c60: 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20  eir Expr.iTable 
4c70: 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65  fields to.** the
4c80: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
4c90: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
4ca0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
4cb0: 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74  just has to.** t
4cc0: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72  ranslate the cur
4cd0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
4ce0: 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
4cf0: 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68  and OR all.** th
4d00: 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74  e bitmasks toget
4d10: 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  her..*/.static B
4d20: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
4d30: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4d40: 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73  askSet*, ExprLis
4d50: 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d  t*);.static Bitm
4d60: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
4d70: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
4d80: 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29  skSet*, Select*)
4d90: 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  ;.static Bitmask
4da0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
4db0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
4dc0: 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29  askSet, Expr *p)
4dd0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
4de0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30   = 0;.  if( p==0
4df0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4e00: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
4e10: 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20  UMN ){.    mask 
4e20: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
4e30: 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a  et, p->iTable);.
4e40: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b      return mask;
4e50: 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78  .  }.  mask = ex
4e60: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
4e70: 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74  skSet, p->pRight
4e80: 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  );.  mask |= exp
4e90: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
4ea0: 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  kSet, p->pLeft);
4eb0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
4ec0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
4ed0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d  Select) ){.    m
4ee0: 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63  ask |= exprSelec
4ef0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
4f00: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  kSet, p->x.pSele
4f10: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ct);.  }else{.  
4f20: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
4f30: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
4f40: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73  skSet, p->x.pLis
4f50: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
4f60: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
4f70: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
4f80: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
4f90: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
4fa0: 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  t, ExprList *pLi
4fb0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
4fc0: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
4fd0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
4fe0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4ff0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
5000: 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c  +){.      mask |
5010: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
5020: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74  (pMaskSet, pList
5030: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
5040: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5050: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
5060: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c   Bitmask exprSel
5070: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  ectTableUsage(Wh
5080: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
5090: 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53  kSet, Select *pS
50a0: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
50b0: 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  k = 0;.  while( 
50c0: 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  pS ){.    SrcLis
50d0: 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70 53  t *pSrc = pS->pS
50e0: 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  rc;.    mask |= 
50f0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
5100: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
5110: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61  >pEList);.    ma
5120: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
5130: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
5140: 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29  t, pS->pGroupBy)
5150: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
5160: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
5170: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
5180: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61  OrderBy);.    ma
5190: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
51a0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
51b0: 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  S->pWhere);.    
51c0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
51d0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
51e0: 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20   pS->pHaving);. 
51f0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
5200: 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  rc!=0) ){.      
5210: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
5220: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
5230: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
5240: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65    mask |= exprSe
5250: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
5260: 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61  MaskSet, pSrc->a
5270: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
5280: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78        mask |= ex
5290: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
52a0: 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69  skSet, pSrc->a[i
52b0: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ].pOn);.      }.
52c0: 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70      }.    pS = p
52d0: 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20  S->pPrior;.  }. 
52e0: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
52f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
5300: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
5310: 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20  operator is one 
5320: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
5330: 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f   that is.** allo
5340: 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  wed for an index
5350: 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  able WHERE claus
5360: 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c  e term.  The all
5370: 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61  owed operators a
5380: 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20  re.** "=", "<", 
5390: 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c  ">", "<=", ">=",
53a0: 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a 2a   and "IN"..**.**
53b0: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
53c0: 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32 36 33 39  OF: R-59926-2639
53d0: 33 20 54 6f 20 62 65 20 75 73 61 62 6c 65 20 62  3 To be usable b
53e0: 79 20 61 6e 20 69 6e 64 65 78 20 61 20 74 65 72  y an index a ter
53f0: 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f 66 20  m must be.** of 
5400: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
5410: 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f 6c 75  wing forms: colu
5420: 6d 6e 20 3d 20 65 78 70 72 65 73 73 69 6f 6e 20  mn = expression 
5430: 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65 73 73  column > express
5440: 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e 3d  ion.** column >=
5450: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75   expression colu
5460: 6d 6e 20 3c 20 65 78 70 72 65 73 73 69 6f 6e 20  mn < expression 
5470: 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72 65 73  column <= expres
5480: 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  sion.** expressi
5490: 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78 70 72  on = column expr
54a0: 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e 20  ession > column 
54b0: 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20 63 6f  expression >= co
54c0: 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  lumn.** expressi
54d0: 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78 70 72  on < column expr
54e0: 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d 6e  ession <= column
54f0: 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28 65   column IN.** (e
5500: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 29 20  xpression-list) 
5510: 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62 71 75  column IN (subqu
5520: 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53 20 4e  ery) column IS N
5530: 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ULL.*/.static in
5540: 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20  t allowedOp(int 
5550: 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54  op){.  assert( T
5560: 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_GT>TK_EQ && TK
5570: 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _GT<TK_GE );.  a
5580: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f  ssert( TK_LT>TK_
5590: 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47  EQ && TK_LT<TK_G
55a0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
55b0: 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LE>TK_EQ && TK
55c0: 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LE<TK_GE );.  a
55d0: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
55e0: 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72  _EQ+4 );.  retur
55f0: 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28  n op==TK_IN || (
5600: 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c  op>=TK_EQ && op<
5610: 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54  =TK_GE) || op==T
5620: 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a  K_ISNULL;.}../*.
5630: 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65  ** Swap two obje
5640: 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50 45  cts of type TYPE
5650: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41  ..*/.#define SWA
5660: 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50  P(TYPE,A,B) {TYP
5670: 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b  E t=A; A=B; B=t;
5680: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65  }../*.** Commute
5690: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
56a0: 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73  erator.  Express
56b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
56c0: 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65   "X op Y".** are
56d0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
56e0: 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20  "Y op X"..**.** 
56f0: 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20 70 72  If left/right pr
5700: 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73 20 63  ecedence rules c
5710: 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20 77 68  ome into play wh
5720: 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74  en determining t
5730: 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 0a  he.** collating.
5740: 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  ** side of the c
5750: 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65  omparison, it re
5760: 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64  mains associated
5770: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73   with the same s
5780: 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ide after.** the
5790: 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f   commutation. So
57a0: 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "Y collate NOCA
57b0: 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73  SE op X" becomes
57c0: 20 0a 2a 2a 20 22 58 20 6f 70 20 59 22 2e 20 54   .** "X op Y". T
57d0: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61  his is because a
57e0: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
57f0: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
5800: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
5810: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
5820: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
5830: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
5840: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
5850: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
5860: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
5870: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
5880: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
5890: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
58a0: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
58b0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
58c0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
58d0: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
58e0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
58f0: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
5900: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
5910: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
5920: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ft->flags & EP_C
5930: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
5940: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
5950: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
5960: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
5970: 20 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65   if( expRight==e
5980: 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a  xpLeft ){.    /*
5990: 20 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20   Either X and Y 
59a0: 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54  both have COLLAT
59b0: 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65  E operator or ne
59c0: 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20  ither do */.    
59d0: 69 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a  if( expRight ){.
59e0: 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20        /* Both X 
59f0: 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  and Y have COLLA
5a00: 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d  TE operators.  M
5a10: 61 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c  ake sure X is al
5a20: 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ways.      ** us
5a30: 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ed by clearing t
5a40: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
5a50: 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20  ag from Y. */.  
5a60: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
5a70: 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f  t->flags &= ~EP_
5a80: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c  Collate;.    }el
5a90: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  se if( sqlite3Ex
5aa0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
5ab0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  , pExpr->pLeft)!
5ac0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  =0 ){.      /* N
5ad0: 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68  either X nor Y h
5ae0: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
5af0: 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73  ators, but X has
5b00: 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20   a non-default. 
5b10: 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e       ** collatin
5b20: 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20  g sequence.  So 
5b30: 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  add the EP_Colla
5b40: 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74  te marker on X t
5b50: 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  o cause.      **
5b60: 20 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68   it to be search
5b70: 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  ed first. */.   
5b80: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
5b90: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
5ba0: 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  late;.    }.  }.
5bb0: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
5bc0: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
5bd0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
5be0: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
5bf0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5c00: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
5c10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
5c20: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
5c30: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
5c40: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
5c50: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
5c60: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
5c70: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
5c80: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
5c90: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
5ca0: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
5cb0: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
5cc0: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
5cd0: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
5ce0: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
5cf0: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
5d00: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
5d10: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
5d20: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
5d30: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
5d40: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
5d50: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
5d60: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
5d70: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
5d80: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
5d90: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
5da0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
5db0: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
5dc0: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
5dd0: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
5de0: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
5df0: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
5e00: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
5e10: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
5e20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5e30: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
5e40: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
5e50: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
5e60: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
5e70: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
5e80: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
5e90: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
5ea0: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
5eb0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5ec0: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
5ed0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
5ee0: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
5ef0: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
5f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
5f10: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
5f20: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5f30: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
5f40: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
5f50: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
5f60: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
5f70: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
5f80: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
5f90: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
5fa0: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
5fb0: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
5fc0: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
5fd0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
5fe0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
5ff0: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
6000: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
6010: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  d..**.** The ter
6020: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
6030: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
6040: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
6050: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
6060: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
6070: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
6080: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
6090: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
60a0: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
60b0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
60c0: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
60d0: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
60e0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
60f0: 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61  ** aEquiv[] arra
6100: 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c  y holds X and al
6110: 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74  l its equivalent
6120: 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c  s, with each SQL
6130: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b   variable.** tak
6140: 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73  ing up two slots
6150: 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54   in aEquiv[].  T
6160: 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73  he first slot is
6170: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20   for the cursor 
6180: 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68  number.** and th
6190: 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20  e second is for 
61a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
61b0: 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32  r.  There are 22
61c0: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
61d0: 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65  [].** so that me
61e0: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
61f0: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
6200: 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61   10 other equiva
6210: 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  lent values..** 
6220: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
6230: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
6240: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20   <expr> if X=A1 
6250: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
6260: 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61  =A3.** and ... a
6270: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
6280: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
6290: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
62a0: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
62b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
62c0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
62d0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
62e0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
62f0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
6300: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
6310: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
6320: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
6330: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
6340: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
6350: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
6360: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
6370: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
6380: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
6390: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
63a0: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
63b0: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
63c0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
63d0: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
63e0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
63f0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
6400: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
6410: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
6420: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
6430: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
6440: 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  IV..*/.static Wh
6450: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
6460: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
6470: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
6480: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
6490: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
64a0: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
64b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
64c0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
64d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
64e0: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
64f0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
6500: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
6510: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
6520: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
6530: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
6540: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
6550: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6560: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
6570: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
6580: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
6590: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
65a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
65b0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
65c0: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
65d0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
65e0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
65f0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
6600: 2f 2a 20 54 65 72 6d 20 62 65 69 6e 67 20 65 78  /* Term being ex
6610: 61 6d 69 6e 65 64 20 61 73 20 70 6f 73 73 69 62  amined as possib
6620: 6c 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 57  le result */.  W
6630: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
6640: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  t = 0;      /* T
6650: 68 65 20 61 6e 73 77 65 72 20 74 6f 20 72 65 74  he answer to ret
6660: 75 72 6e 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  urn */.  WhereCl
6670: 61 75 73 65 20 2a 70 57 43 4f 72 69 67 20 3d 20  ause *pWCOrig = 
6680: 70 57 43 3b 20 20 2f 2a 20 4f 72 69 67 69 6e 61  pWC;  /* Origina
6690: 6c 20 70 57 43 20 76 61 6c 75 65 20 2a 2f 0a 20  l pWC value */. 
66a0: 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
66c0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
66d0: 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20  /.  Expr *pX;   
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
66f0: 50 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78  Pointer to an ex
6700: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 50 61  pression */.  Pa
6710: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
6720: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
6730: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
6740: 6e 74 20 69 4f 72 69 67 43 6f 6c 20 3d 20 69 43  nt iOrigCol = iC
6750: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 4f 72 69 67 69  olumn;  /* Origi
6760: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 43 6f  nal value of iCo
6770: 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  lumn */.  int nE
6780: 71 75 69 76 20 3d 20 32 3b 20 20 20 20 20 20 20  quiv = 2;       
6790: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
67a0: 65 6e 74 69 72 65 73 20 69 6e 20 61 45 71 75 69  entires in aEqui
67b0: 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71  v[] */.  int iEq
67c0: 75 69 76 20 3d 20 32 3b 20 20 20 20 20 20 20 20  uiv = 2;        
67d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
67e0: 6e 74 72 69 65 73 20 6f 66 20 61 45 71 75 69 76  ntries of aEquiv
67f0: 5b 5d 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20  [] processed so 
6800: 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20 61 45 71  far */.  int aEq
6810: 75 69 76 5b 32 32 5d 3b 20 20 20 20 20 20 20 20  uiv[22];        
6820: 20 20 2f 2a 20 69 43 75 72 2c 69 43 6f 6c 75 6d    /* iCur,iColum
6830: 6e 20 61 6e 64 20 75 70 20 74 6f 20 31 30 20 6f  n and up to 10 o
6840: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 73  ther equivalents
6850: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
6860: 43 75 72 3e 3d 30 20 29 3b 0a 20 20 61 45 71 75  Cur>=0 );.  aEqu
6870: 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20  iv[0] = iCur;.  
6880: 61 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c  aEquiv[1] = iCol
6890: 75 6d 6e 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  umn;.  for(;;){.
68a0: 20 20 20 20 66 6f 72 28 70 57 43 3d 70 57 43 4f      for(pWC=pWCO
68b0: 72 69 67 3b 20 70 57 43 3b 20 70 57 43 3d 70 57  rig; pWC; pWC=pW
68c0: 43 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  C->pOuter){.    
68d0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
68e0: 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, k=pWC->nTerm
68f0: 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  ; k; k--, pTerm+
6900: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
6910: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
6920: 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20  r==iCur.        
6930: 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65    && pTerm->u.le
6940: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
6950: 6e 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  n.        ){.   
6960: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
6970: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
6980: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20   notReady)==0.  
6990: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 65           && (pTe
69a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
69b0: 6f 70 20 26 20 57 4f 5f 41 4c 4c 29 21 3d 30 0a  op & WO_ALL)!=0.
69c0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
69d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 72           if( iOr
69e0: 69 67 43 6f 6c 3e 3d 30 20 26 26 20 70 49 64 78  igCol>=0 && pIdx
69f0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
6a00: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
6a10: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
6a20: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
6a30: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
6a40: 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
6a50: 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 20  ;.      .       
6a60: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
6a70: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
6a80: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 20 3d          pParse =
6a90: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pWC->pParse;.  
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 69 64 78 61              idxa
6ab0: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
6ac0: 65 2d 3e 61 43 6f 6c 5b 69 4f 72 69 67 43 6f 6c  e->aCol[iOrigCol
6ad0: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
6ae0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
6af0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
6b00: 69 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66  ityOk(pX, idxaff
6b10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
6b20: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6b40: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
6b50: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
6b60: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
6b70: 73 65 71 75 65 6e 63 65 20 72 65 71 75 69 72 65  sequence require
6b80: 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20  d from an index 
6b90: 66 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  for.            
6ba0: 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73    ** it to be us
6bb0: 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73  eful for optimis
6bc0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ing expression p
6bd0: 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20  X. Store this.  
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76              ** v
6bf0: 61 6c 75 65 20 69 6e 20 76 61 72 69 61 62 6c 65  alue in variable
6c00: 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20   pColl..        
6c10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6c20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58         assert(pX
6c30: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
6c40: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
6c50: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
6c60: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
6c70: 73 65 2c 70 58 2d 3e 70 4c 65 66 74 2c 70 58 2d  se,pX->pLeft,pX-
6c80: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
6c90: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
6ca0: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70  l==0 ) pColl = p
6cb0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
6cc0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 0a 20 20 20  Coll;.      .   
6cd0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
6ce0: 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  =0; pIdx->aiColu
6cf0: 6d 6e 5b 6a 5d 21 3d 69 4f 72 69 67 43 6f 6c 3b  mn[j]!=iOrigCol;
6d00: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
6d10: 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
6d20: 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  (j>=pIdx->nColum
6d30: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
6d60: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6d70: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
6d80: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29  dx->azColl[j]) )
6d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6da0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6db0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6dc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6dd0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
6de0: 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20  >prereqRight==0 
6df0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6e00: 20 70 52 65 73 75 6c 74 20 3d 20 70 54 65 72 6d   pResult = pTerm
6e10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6e20: 67 6f 74 6f 20 66 69 6e 64 54 65 72 6d 5f 73 75  goto findTerm_su
6e30: 63 63 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20  ccess;.         
6e40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 65     }else if( pRe
6e50: 73 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sult==0 ){.     
6e60: 20 20 20 20 20 20 20 20 20 70 52 65 73 75 6c 74           pResult
6e70: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
6e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6e90: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
6ea0: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
6eb0: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21  tor & WO_EQUIV)!
6ec0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
6ed0: 20 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a   nEquiv<ArraySiz
6ee0: 65 28 61 45 71 75 69 76 29 0a 20 20 20 20 20 20  e(aEquiv).      
6ef0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
6f00: 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45     pX = sqlite3E
6f10: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
6f20: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
6f30: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
6f40: 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
6f50: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
6f60: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
6f70: 3d 30 3b 20 6a 3c 6e 45 71 75 69 76 3b 20 6a 2b  =0; j<nEquiv; j+
6f80: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  =2){.           
6f90: 20 20 20 69 66 28 20 61 45 71 75 69 76 5b 6a 5d     if( aEquiv[j]
6fa0: 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 20 26 26 20  ==pX->iTable && 
6fb0: 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d  aEquiv[j+1]==pX-
6fc0: 3e 69 43 6f 6c 75 6d 6e 20 29 20 62 72 65 61 6b  >iColumn ) break
6fd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6ff0: 6a 3d 3d 6e 45 71 75 69 76 20 29 7b 0a 20 20 20  j==nEquiv ){.   
7000: 20 20 20 20 20 20 20 20 20 20 20 61 45 71 75 69             aEqui
7010: 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c  v[j] = pX->iTabl
7020: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
7030: 20 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70   aEquiv[j+1] = p
7040: 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  X->iColumn;.    
7050: 20 20 20 20 20 20 20 20 20 20 6e 45 71 75 69 76            nEquiv
7060: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
7070: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
7080: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7090: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
70a0: 20 69 45 71 75 69 76 3e 3d 6e 45 71 75 69 76 20   iEquiv>=nEquiv 
70b0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 43 75  ) break;.    iCu
70c0: 72 20 3d 20 61 45 71 75 69 76 5b 69 45 71 75 69  r = aEquiv[iEqui
70d0: 76 2b 2b 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d  v++];.    iColum
70e0: 6e 20 3d 20 61 45 71 75 69 76 5b 69 45 71 75 69  n = aEquiv[iEqui
70f0: 76 2b 2b 5d 3b 0a 20 20 7d 0a 66 69 6e 64 54 65  v++];.  }.findTe
7100: 72 6d 5f 73 75 63 63 65 73 73 3a 0a 20 20 72 65  rm_success:.  re
7110: 74 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a  turn pResult;.}.
7120: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
7130: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
7140: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
7150: 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65  (SrcList*, Where
7160: 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a  Clause*, int);..
7170: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41  /*.** Call exprA
7180: 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65  nalyze on all te
7190: 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63  rms in a WHERE c
71a0: 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  lause.  .**.**.*
71b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
71c0: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20  prAnalyzeAll(.  
71d0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
71e0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  t,       /* the 
71f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
7200: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
7210: 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  C         /* the
7220: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
7230: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
7240: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
7250: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
7260: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
7270: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54    exprAnalyze(pT
7280: 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b  abList, pWC, i);
7290: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
72a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
72b0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a  _OPTIMIZATION./*
72c0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
72d0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
72e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49  pression is a LI
72f0: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
7300: 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  tor that.** can 
7310: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  be optimized usi
7320: 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ng inequality co
7330: 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75  nstraints.  Retu
7340: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
7350: 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65  .** so and false
7360: 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49   if not..**.** I
7370: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  n order for the 
7380: 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
7390: 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20  ptimizible, the 
73a0: 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74  RHS must be a st
73b0: 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20  ring.** literal 
73c0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  that does not be
73d0: 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63  gin with a wildc
73e0: 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  ard.  .*/.static
73f0: 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f   int isLikeOrGlo
7400: 62 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  b(.  Parse *pPar
7410: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
7420: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
7430: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
7440: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
7450: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
7460: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
7470: 20 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69    Expr **ppPrefi
7480: 78 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  x,  /* Pointer t
7490: 6f 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72  o TK_STRING expr
74a0: 65 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74  ession with patt
74b0: 65 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  ern prefix */.  
74c0: 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  int *pisComplete
74d0: 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  , /* True if the
74e0: 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69   only wildcard i
74f0: 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20  s % in the last 
7500: 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69  character */.  i
7510: 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20  nt *pnoCase     
7520: 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65   /* True if uppe
7530: 72 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c  rcase is equival
7540: 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65  ent to lowercase
7550: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
7560: 68 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20  har *z = 0;     
7570: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e      /* String on
7580: 20 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65   RHS of LIKE ope
7590: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20  rator */.  Expr 
75a0: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
75b0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61        /* Right a
75c0: 6e 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20  nd left size of 
75d0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
75e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
75f0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
7600: 20 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64   List of operand
7610: 73 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70  s to the LIKE op
7620: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
7630: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7640: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68         /* One ch
7650: 61 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a  aracter in z[] *
7660: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7680: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d  * Number of non-
7690: 77 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20  wildcard prefix 
76a0: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
76b0: 63 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20  char wc[3];     
76c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
76d0: 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72  ldcard character
76e0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
76f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7700: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
7710: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  nnection */.  sq
7720: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
7730: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b  l = 0;.  int op;
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66      /* Opcode of
7760: 20 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66   pRight */..  if
7770: 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  ( !sqlite3IsLike
7780: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78  Function(db, pEx
7790: 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29  pr, pnoCase, wc)
77a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
77b0: 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
77c0: 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28  ITE_EBCDIC.  if(
77d0: 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75   *pnoCase ) retu
77e0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70  rn 0;.#endif.  p
77f0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
7800: 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d  pList;.  pLeft =
7810: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
7820: 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d  pr;.  if( pLeft-
7830: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a  >op!=TK_COLUMN .
7840: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70     || sqlite3Exp
7850: 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
7860: 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  !=SQLITE_AFF_TEX
7870: 54 20 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75  T .   || IsVirtu
7880: 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a  al(pLeft->pTab).
7890: 20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a    ){.    /* IMP:
78a0: 20 52 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54   R-02065-49465 T
78b0: 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
78c0: 65 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72  e of the LIKE or
78d0: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d   GLOB operator m
78e0: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
78f0: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64  e name of an ind
7900: 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68  exed column with
7910: 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20   TEXT affinity. 
7920: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
7930: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
7940: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28  Left->iColumn!=(
7950: 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73  -1) ); /* Becaus
7960: 65 20 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20  e IPK never has 
7970: 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70  AFF_TEXT */..  p
7980: 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61  Right = pList->a
7990: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20  [0].pExpr;.  op 
79a0: 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20  = pRight->op;.  
79b0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
79c0: 54 45 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  TER ){.    op = 
79d0: 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d  pRight->op2;.  }
79e0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41  .  if( op==TK_VA
79f0: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64  RIABLE ){.    Vd
7a00: 62 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d  be *pReprepare =
7a10: 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70   pParse->pReprep
7a20: 61 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  are;.    int iCo
7a30: 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  l = pRight->iCol
7a40: 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  umn;.    pVal = 
7a50: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61  sqlite3VdbeGetVa
7a60: 6c 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20  lue(pReprepare, 
7a70: 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46  iCol, SQLITE_AFF
7a80: 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20  _NONE);.    if( 
7a90: 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f  pVal && sqlite3_
7aa0: 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
7ab0: 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
7ac0: 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72  .      z = (char
7ad0: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
7ae0: 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20  _text(pVal);.   
7af0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
7b00: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61  beSetVarmask(pPa
7b10: 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c  rse->pVdbe, iCol
7b20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
7b30: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  Right->op==TK_VA
7b40: 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74  RIABLE || pRight
7b50: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
7b60: 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  R );.  }else if(
7b70: 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29   op==TK_STRING )
7b80: 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74  {.    z = pRight
7b90: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a  ->u.zToken;.  }.
7ba0: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63    if( z ){.    c
7bb0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
7bc0: 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30  e( (c=z[cnt])!=0
7bd0: 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20   && c!=wc[0] && 
7be0: 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77  c!=wc[1] && c!=w
7bf0: 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e  c[2] ){.      cn
7c00: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t++;.    }.    i
7c10: 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35  f( cnt!=0 && 255
7c20: 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29  !=(u8)z[cnt-1] )
7c30: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50  {.      Expr *pP
7c40: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69  refix;.      *pi
7c50: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77  sComplete = c==w
7c60: 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d  c[0] && z[cnt+1]
7c70: 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66  ==0;.      pPref
7c80: 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ix = sqlite3Expr
7c90: 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20  (db, TK_STRING, 
7ca0: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  z);.      if( pP
7cb0: 72 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d  refix ) pPrefix-
7cc0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d  >u.zToken[cnt] =
7cd0: 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65   0;.      *ppPre
7ce0: 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20  fix = pPrefix;. 
7cf0: 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
7d00: 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20  VARIABLE ){.    
7d10: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
7d20: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
7d30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7d40: 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52  SetVarmask(v, pR
7d50: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  ight->iColumn);.
7d60: 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73          if( *pis
7d70: 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67  Complete && pRig
7d80: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20  ht->u.zToken[1] 
7d90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
7da0: 49 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68  If the rhs of th
7db0: 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f  e LIKE expressio
7dc0: 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c  n is a variable,
7dd0: 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
7de0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61  .          ** va
7df0: 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61  lue of the varia
7e00: 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ble means there 
7e10: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e  is no need to in
7e20: 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20  voke the LIKE.  
7e30: 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
7e40: 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f  ion, then no OP_
7e50: 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65  Variable will be
7e60: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72   added to the pr
7e70: 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20  ogram..         
7e80: 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20   ** This causes 
7e90: 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65  problems for the
7ea0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
7eb0: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20  rameter_name(). 
7ec0: 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e           ** API.
7ed0: 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74   To workaround t
7ee0: 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79  hem, add a dummy
7ef0: 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72   OP_Variable her
7f00: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20  e..          */ 
7f10: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
7f20: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
7f30: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
7f40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7f50: 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
7f60: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
7f70: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
7f80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7f90: 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  3(v, sqlite3Vdbe
7fa0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
7fb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7fc0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
7fd0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
7fe0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7ff0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8000: 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20        z = 0;.   
8010: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
8020: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
8030: 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30  ;.  return (z!=0
8040: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
8050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
8060: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
8070: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8080: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8090: 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  LE./*.** Check t
80a0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
80b0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
80c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
80d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
80e0: 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a  n MATCH expr.**.
80f0: 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e  ** If it is then
8100: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49   return TRUE.  I
8110: 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41  f not, return FA
8120: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
8130: 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  nt isMatchOfColu
8140: 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70  mn(.  Expr *pExp
8150: 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74  r      /* Test t
8160: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
8170: 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
8180: 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  *pList;..  if( p
8190: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e  Expr->op!=TK_FUN
81a0: 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74  CTION ){.    ret
81b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
81c0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
81d0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
81e0: 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20  "match")!=0 ){. 
81f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8200: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
8210: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28  ->x.pList;.  if(
8220: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32   pList->nExpr!=2
8230: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8240: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
8250: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[1].pExpr->o
8260: 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29  p != TK_COLUMN )
8270: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
8290: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
82a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
82b0: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ABLE */../*.** I
82c0: 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72  f the pBase expr
82d0: 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
82e0: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
82f0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a  SING clause of.*
8300: 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  * a join, then t
8310: 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72  ransfer the appr
8320: 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73  opriate markings
8330: 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64   over to derived
8340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8350: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
8360: 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72  kings(Expr *pDer
8370: 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73  ived, Expr *pBas
8380: 65 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  e){.  pDerived->
8390: 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e  flags |= pBase->
83a0: 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a  flags & EP_FromJ
83b0: 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d  oin;.  pDerived-
83c0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
83d0: 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74   = pBase->iRight
83e0: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69  JoinTable;.}..#i
83f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8400: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
8410: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
8420: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8430: 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20  SUBQUERY)./*.** 
8440: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
8450: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
8460: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63  two or more OR-c
8470: 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74  onnected.** subt
8480: 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a  erms.  So in:.**
8490: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52  .**     ... WHER
84a0: 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d  E  (a=5) AND (b=
84b0: 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33  7 OR c=9 OR d=13
84c0: 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20  ) AND (d=13).** 
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84e0: 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e           ^^^^^^^
84f0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a  ^^^^^^^^^^^^^.**
8500: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8510: 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20   analyzes terms 
8520: 73 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64  such as the midd
8530: 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61  le term in the a
8540: 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a  bove example..**
8550: 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f   A WhereOrTerm o
8560: 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65  bject is compute
8570: 64 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74  d and attached t
8580: 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72  o the term under
8590: 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65  .** analysis, re
85a0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
85b0: 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61  outcome of the a
85c0: 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a  nalysis.  Hence:
85d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  .**.**     Where
85e0: 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c  Term.wtFlags   |
85f0: 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a  =  TERM_ORINFO.*
8600: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
8610: 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20  u.pOrInfo  =  a 
8620: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
8630: 63 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72  cated WhereOrTer
8640: 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54  m object.**.** T
8650: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  he term being an
8660: 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65  alyzed must have
8670: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20   two or more of 
8680: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62  OR-connected sub
8690: 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67  terms..** A sing
86a0: 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74  le subterm might
86b0: 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44   be a set of AND
86c0: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73  -connected sub-s
86d0: 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d  ubterms..** Exam
86e0: 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e  ples of terms un
86f0: 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a  der analysis:.**
8700: 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20  .**     (A)     
8710: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e  t1.x=t2.y OR t1.
8720: 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31  x=t2.z OR t1.y=1
8730: 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35  5 OR t1.z=t3.a+5
8740: 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20  .**     (B)     
8750: 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32  x=expr1 OR expr2
8760: 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a  =x OR x=expr3.**
8770: 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e       (C)     t1.
8780: 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d  x=t2.y OR (t1.x=
8790: 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35  t2.z AND t1.y=15
87a0: 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20  ).**     (D)    
87b0: 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31   x=expr1 OR (y>1
87c0: 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a  1 AND y<22 AND z
87d0: 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29   LIKE '*hello*')
87e0: 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20  .**     (E)     
87f0: 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32  (p.a=1 AND q.b=2
8800: 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28   AND r.c=3) OR (
8810: 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20  p.x=4 AND q.y=5 
8820: 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a  AND r.z=6).**.**
8830: 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 1:.**.** I
8840: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
8850: 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54  re of the form T
8860: 2e 43 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65  .C=expr for some
8870: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f   single column o
8880: 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e  f C and.** a sin
8890: 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73 20  gle table T (as 
88a0: 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65  shown in example
88b0: 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63   B above) then c
88c0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
88d0: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ual.** term that
88e0: 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   is an equivalen
88f0: 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  t IN expression.
8900: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
8910: 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a  , if the term.**
8920: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
8930: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
8940: 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78   = expr1  OR  ex
8950: 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d  pr2 = x  OR  x =
8960: 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65   expr3.**.** the
8970: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
8980: 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65  irtual term like
8990: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
89a0: 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78    x IN (expr1,ex
89b0: 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a  pr2,expr3).**.**
89c0: 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 2:.**.** I
89d0: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
89e0: 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20  re indexable by 
89f0: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
8a00: 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a  , then set.**.**
8a10: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65       WhereTerm.e
8a20: 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20 20  Operator        
8a30: 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a        =  WO_OR.*
8a40: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
8a50: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
8a60: 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75  able  |=  the cu
8a70: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
8a80: 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20  table T.**.** A 
8a90: 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65  subterm is "inde
8aa0: 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73 20  xable" if it is 
8ab0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22  of the form.** "
8ac0: 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22  T.C <op> <expr>"
8ad0: 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79 20   where C is any 
8ae0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
8af0: 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69  T and .** <op> i
8b00: 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c  s one of "=", "<
8b10: 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e  ", "<=", ">", ">
8b20: 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f  =", "IS NULL", o
8b30: 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62  r "IN"..** A sub
8b40: 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64  term is also ind
8b50: 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73 20  exable if it is 
8b60: 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72  an AND of two or
8b70: 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74   more.** subsubt
8b80: 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  erms at least on
8b90: 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e  e of which is in
8ba0: 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61  dexable.  Indexa
8bb0: 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74  ble AND .** subt
8bc0: 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72 20  erms have their 
8bd0: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
8be0: 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79   WO_AND and they
8bf0: 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49   have.** u.pAndI
8c00: 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e  nfo set to a dyn
8c10: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
8c20: 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20  ed WhereAndTerm 
8c30: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72  object..**.** Fr
8c40: 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74  om another point
8c50: 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78   of view, "index
8c60: 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74  able" means that
8c70: 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75   the subterm cou
8c80: 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c  ld.** potentiall
8c90: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
8ca0: 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70  n index if an ap
8cb0: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20  propriate index 
8cc0: 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20  exists..** This 
8cd0: 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f  analysis does no
8ce0: 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68  t consider wheth
8cf0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e  er or not the in
8d00: 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61 74  dex exists; that
8d10: 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  .** is something
8d20: 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29   the bestIndex()
8d30: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65   routine will de
8d40: 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61  termine.  This a
8d50: 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20  nalysis.** only 
8d60: 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72  looks at whether
8d70: 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70   subterms approp
8d80: 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69  riate for indexi
8d90: 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ng exist..**.** 
8da0: 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74  All examples A t
8db0: 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61  hrough E above a
8dc0: 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ll satisfy case 
8dd0: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
8de0: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73  m.** also statis
8df0: 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63  fies case 1 (suc
8e00: 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20  h as B) we know 
8e10: 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
8e20: 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79  er will.** alway
8e30: 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c  s prefer case 1,
8e40: 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
8e50: 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74   we pretend that
8e60: 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a   case 2 is not.*
8e70: 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a  * satisfied..**.
8e80: 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74  ** It might be t
8e90: 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c  he case that mul
8ea0: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65  tiple tables are
8eb0: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72   indexable.  For
8ec0: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29   example,.** (E)
8ed0: 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61   above is indexa
8ee0: 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c  ble on tables P,
8ef0: 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a   Q, and R..**.**
8f00: 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69   Terms that sati
8f10: 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63  sfy case 2 are c
8f20: 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f  andidates for lo
8f30: 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a  okup by using.**
8f40: 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
8f50: 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73  s to find rowids
8f60: 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72   for each subter
8f70: 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a  m and composing.
8f80: 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20  ** the union of 
8f90: 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67  all rowids using
8fa0: 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
8fb0: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
8fc0: 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70  ar.** to "bitmap
8fd0: 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68   indices" in oth
8fe0: 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  er database engi
8ff0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52  nes..**.** OTHER
9000: 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  WISE:.**.** If n
9010: 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f  either case 1 no
9020: 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20  r case 2 apply, 
9030: 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65  then leave the e
9040: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a  Operator set to.
9050: 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74  ** zero.  This t
9060: 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75  erm is not usefu
9070: 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f  l for search..*/
9080: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9090: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a  rAnalyzeOrTerm(.
90a0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
90c0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
90d0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
90e0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
90f0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48   the complete WH
9100: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
9110: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
9120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9130: 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72  ex of the OR-ter
9140: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
9150: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
9160: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
9170: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
9180: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
9190: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
91a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
91b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
91c0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
91d0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ection */.  Wher
91e0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
91f0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9200: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
9210: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
9220: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
9230: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20  = pTerm->pExpr; 
9240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9250: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
9260: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57   the term */.  W
9270: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
9280: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
9290: 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20  skSet; /* Table 
92a0: 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69  use masks */.  i
92b0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
92e0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
92f0: 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
9300: 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75         /* Breaku
9310: 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20  p of pTerm into 
9320: 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68  subterms */.  Wh
9330: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
9340: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62  ;       /* A Sub
9350: 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  -term within the
9360: 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72   pOrWc */.  Wher
9370: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
9380: 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f  ;     /* Additio
9390: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
93a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
93b0: 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61  pTerm */.  Bitma
93c0: 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20  sk chngToIN;    
93d0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
93e0: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
93f0: 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69  y case 1 */.  Bi
9400: 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b  tmask indexable;
9410: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
9420: 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78  s that are index
9430: 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67  able, satisfying
9440: 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a   case 2 */..  /*
9450: 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20  .  ** Break the 
9460: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69  OR clause into i
9470: 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74  ts separate subt
9480: 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65  erms.  The subte
9490: 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f  rms are.  ** sto
94a0: 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c  red in a WhereCl
94b0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63  ause structure c
94c0: 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e  ontaining within
94d0: 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f   the WhereOrInfo
94e0: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  .  ** object tha
94f0: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
9500: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52   the original OR
9510: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20   clause term..  
9520: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  */.  assert( (pT
9530: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
9540: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
9550: 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e  M_ORINFO|TERM_AN
9560: 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  DINFO))==0 );.  
9570: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
9580: 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54  p==TK_OR );.  pT
9590: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d  erm->u.pOrInfo =
95a0: 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74   pOrInfo = sqlit
95b0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
95c0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e  b, sizeof(*pOrIn
95d0: 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49  fo));.  if( pOrI
95e0: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
95f0: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
9600: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  s |= TERM_ORINFO
9610: 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72  ;.  pOrWc = &pOr
9620: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72  Info->wc;.  wher
9630: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57  eClauseInit(pOrW
9640: 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  c, pWC->pParse, 
9650: 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77  pMaskSet, pWC->w
9660: 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 77 68  ctrlFlags);.  wh
9670: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
9680: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
9690: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
96a0: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
96b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
96c0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
96d0: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
96e0: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
96f0: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
9700: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
9710: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
9720: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
9730: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
9740: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
9750: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
9760: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
9770: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
9780: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
9790: 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e  c->a; i>=0 && in
97a0: 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f  dexable; i--, pO
97b0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  rTerm++){.    if
97c0: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
97d0: 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c  rator & WO_SINGL
97e0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  E)==0 ){.      W
97f0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e  hereAndInfo *pAn
9800: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73  dInfo;.      ass
9810: 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77  ert( (pOrTerm->w
9820: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41  tFlags & (TERM_A
9830: 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e  NDINFO|TERM_ORIN
9840: 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  FO))==0 );.     
9850: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
9860: 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20       pAndInfo = 
9870: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
9880: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
9890: 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  AndInfo));.     
98a0: 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b   if( pAndInfo ){
98b0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c  .        WhereCl
98c0: 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20  ause *pAndWC;.  
98d0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
98e0: 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20  *pAndTerm;.     
98f0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
9900: 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b    Bitmask b = 0;
9910: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
9920: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70  ->u.pAndInfo = p
9930: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AndInfo;.       
9940: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
9950: 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46  s |= TERM_ANDINF
9960: 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  O;.        pOrTe
9970: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
9980: 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  WO_AND;.        
9990: 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e  pAndWC = &pAndIn
99a0: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
99b0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
99c0: 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 50 61  pAndWC, pWC->pPa
99d0: 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70  rse, pMaskSet, p
99e0: 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b  WC->wctrlFlags);
99f0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 53 70  .        whereSp
9a00: 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54  lit(pAndWC, pOrT
9a10: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41  erm->pExpr, TK_A
9a20: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  ND);.        exp
9a30: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63  rAnalyzeAll(pSrc
9a40: 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20  , pAndWC);.     
9a50: 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65     pAndWC->pOute
9a60: 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20  r = pWC;.       
9a70: 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d   testcase( db->m
9a80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9a90: 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e         if( !db->
9aa0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9ab0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
9ac0: 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64  0, pAndTerm=pAnd
9ad0: 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d  WC->a; j<pAndWC-
9ae0: 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e  >nTerm; j++, pAn
9af0: 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  dTerm++){.      
9b00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41        assert( pA
9b10: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b  ndTerm->pExpr );
9b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
9b30: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54   allowedOp(pAndT
9b40: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20  erm->pExpr->op) 
9b50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9b60: 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d   b |= getMask(pM
9b70: 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d  askSet, pAndTerm
9b80: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
9b90: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9bb0: 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78   }.        index
9bc0: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20  able &= b;.     
9bd0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
9be0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
9bf0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
9c00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  ){.      /* Skip
9c10: 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e   this term for n
9c20: 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74 20  ow.  We revisit 
9c30: 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65  it when we proce
9c40: 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ss the.      ** 
9c50: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45  corresponding TE
9c60: 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20  RM_VIRTUAL term 
9c70: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
9c80: 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20      Bitmask b;. 
9c90: 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b       b = getMask
9ca0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  (pMaskSet, pOrTe
9cb0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
9cc0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
9cd0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9ce0: 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20  RM_VIRTUAL ){.  
9cf0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
9d00: 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63  *pOther = &pOrWc
9d10: 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  ->a[pOrTerm->iPa
9d20: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62  rent];.        b
9d30: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73   |= getMask(pMas
9d40: 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65  kSet, pOther->le
9d50: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
9d60: 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62   }.      indexab
9d70: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69  le &= b;.      i
9d80: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
9d90: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d  erator & WO_EQ)=
9da0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
9db0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
9dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9dd0: 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a   chngToIN &= b;.
9de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9df0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63  }..  /*.  ** Rec
9e00: 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66 20 74  ord the set of t
9e10: 61 62 6c 65 73 20 74 68 61 74 20 73 61 74 69 73  ables that satis
9e20: 66 79 20 63 61 73 65 20 32 2e 20 20 54 68 65 20  fy case 2.  The 
9e30: 73 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a  set might be.  *
9e40: 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  * empty..  */.  
9e50: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
9e60: 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a  le = indexable;.
9e70: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
9e80: 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d  or = indexable==
9e90: 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a  0 ? 0 : WO_OR;..
9ea0: 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    /*.  ** chngTo
9eb0: 49 4e 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f  IN holds a set o
9ec0: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d  f tables that *m
9ed0: 69 67 68 74 2a 20 73 61 74 69 73 66 79 20 63 61  ight* satisfy ca
9ee0: 73 65 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20  se 1.  But.  ** 
9ef0: 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  we have to do so
9f00: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68  me additional ch
9f10: 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66  ecking to see if
9f20: 20 63 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20   case 1 really. 
9f30: 20 2a 2a 20 69 73 20 73 61 74 69 73 66 69 65 64   ** is satisfied
9f40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67  ..  **.  ** chng
9f50: 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65  ToIN will hold e
9f60: 69 74 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32  ither 0, 1, or 2
9f70: 20 62 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69   bits.  The 0-bi
9f80: 74 20 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a  t case means.  *
9f90: 2a 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  * that there is 
9fa0: 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f  no possibility o
9fb0: 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  f transforming t
9fc0: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74  he OR clause int
9fd0: 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65  o an.  ** IN ope
9fe0: 72 61 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e  rator because on
9ff0: 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20  e or more terms 
a000: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
a010: 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f   contain.  ** so
a020: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
a030: 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d  an == on a colum
a040: 6e 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20  n in the single 
a050: 74 61 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69  table.  The 1-bi
a060: 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e  t.  ** case mean
a070: 73 20 74 68 61 74 20 65 76 65 72 79 20 74 65 72  s that every ter
a080: 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75  m of the OR clau
a090: 73 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  se is of the for
a0a0: 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f  m.  ** "table.co
a0b0: 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73  lumn=expr" for s
a0c0: 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  ome single table
a0d0: 2e 20 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74  .  The one bit t
a0e0: 68 61 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20  hat is set.  ** 
a0f0: 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20  will correspond 
a100: 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61  to the common ta
a110: 62 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e  ble.  We still n
a120: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  eed to check to 
a130: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74  make.  ** sure t
a140: 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69  he same column i
a150: 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65  s used on all te
a160: 72 6d 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20  rms.  The 2-bit 
a170: 63 61 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a  case is when.  *
a180: 2a 20 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20  * the all terms 
a190: 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  are of the form 
a1a0: 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74  "table1.column=t
a1b0: 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20  able2.column".  
a1c0: 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  It.  ** might be
a1d0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72   possible to for
a1e0: 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  m an IN operator
a1f0: 20 77 69 74 68 20 65 69 74 68 65 72 20 74 61 62   with either tab
a200: 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  le1.column.  ** 
a210: 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  or table2.column
a220: 20 61 73 20 74 68 65 20 4c 48 53 20 69 66 20 65   as the LHS if e
a230: 69 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20  ither is common 
a240: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  to every term of
a250: 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61  .  ** the OR cla
a260: 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  use..  **.  ** N
a270: 6f 74 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f  ote that terms o
a280: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
a290: 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e  e.column1=table.
a2a0: 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20  column2" (the.  
a2b0: 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e  ** same table on
a2c0: 20 62 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74   both sizes of t
a2d0: 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65  he ==) cannot be
a2e0: 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f   optimized..  */
a2f0: 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20  .  if( chngToIN 
a300: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43  ){.    int okToC
a310: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20  hngToIN = 0;    
a320: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
a330: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e  conversion to IN
a340: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20   is valid */.   
a350: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d   int iColumn = -
a360: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  1;         /* Co
a370: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68  lumn index on lh
a380: 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  s of IN operator
a390: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72   */.    int iCur
a3a0: 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  sor = -1;       
a3b0: 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f    /* Table curso
a3c0: 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  r common to all 
a3d0: 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
a3e0: 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   j = 0;         
a3f0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
a400: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  ounter */..    /
a410: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
a420: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
a430: 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
a440: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a  one side or the.
a450: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20      ** other of 
a460: 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20  the == operator 
a470: 69 6e 20 65 76 65 72 79 20 73 75 62 74 65 72 6d  in every subterm
a480: 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e  .  That table an
a490: 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20  d column.    ** 
a4a0: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
a4b0: 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20   in iCursor and 
a4c0: 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20  iColumn.  There 
a4d0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79  might not be any
a4e0: 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62  .    ** such tab
a4f0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20  le and column.  
a500: 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  Set okToChngToIN
a510: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
a520: 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  te table.    ** 
a530: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f  and column is fo
a540: 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b  und but leave ok
a550: 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65  ToChngToIN false
a560: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
a570: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d     */.    for(j=
a580: 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43  0; j<2 && !okToC
a590: 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20  hngToIN; j++){. 
a5a0: 20 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70       pOrTerm = p
a5b0: 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66  OrWc->a;.      f
a5c0: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
a5d0: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  m-1; i>=0; i--, 
a5e0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
a5f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
a600: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
a610: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
a620: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
a630: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
a640: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
a650: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
a660: 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or==iCursor ){. 
a670: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
a680: 20 69 73 20 74 68 65 20 32 2d 62 69 74 20 63 61   is the 2-bit ca
a690: 73 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e  se and we are on
a6a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
a6b0: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
a6c0: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
a6d0: 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20  erm is from the 
a6e0: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e  first iteration.
a6f0: 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74    So skip this t
a700: 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
a710: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
a720: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
a730: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
a740: 20 20 20 20 20 20 20 20 69 66 28 20 28 63 68 6e          if( (chn
a750: 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28  gToIN & getMask(
a760: 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72  pMaskSet, pOrTer
a770: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d  m->leftCursor))=
a780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a790: 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73  /* This term mus
a7a0: 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  t be of the form
a7b0: 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72   t1.a==t2.b wher
a7c0: 65 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20  e t2 is in the. 
a7d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67           ** chng
a7e0: 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20  ToIN set but t1 
a7f0: 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65  is not.  This te
a800: 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65  rm will be eithe
a810: 72 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20  r preceeded.    
a820: 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c        ** or foll
a830: 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74  wed by an invert
a840: 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74  ed copy (t2.b==t
a850: 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73  1.a).  Skip this
a860: 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20   term .         
a870: 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20   ** and use its 
a880: 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20  inversion. */.  
a890: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
a8a0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
a8b0: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
a8c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
a8d0: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
a8e0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
a8f0: 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
a900: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
a910: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
a920: 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52  (TERM_COPIED|TER
a930: 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20  M_VIRTUAL) );.  
a940: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
a950: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a960: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f      iColumn = pO
a970: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
a980: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75  umn;.        iCu
a990: 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  rsor = pOrTerm->
a9a0: 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  leftCursor;.    
a9b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a9c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30   }.      if( i<0
a9d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
a9e0: 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  o candidate tabl
a9f0: 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75  e+column was fou
aa00: 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e  nd.  This can on
aa10: 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20  ly occur.       
aa20: 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e   ** on the secon
aa30: 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  d iteration */. 
aa40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
aa50: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
aa60: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
aa70: 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b  Two(chngToIN) );
aa80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
aa90: 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61   chngToIN==getMa
aaa0: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 75  sk(pMaskSet, iCu
aab0: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
aac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
aad0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
aae0: 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  j==1 );..      /
aaf0: 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20  * We have found 
ab00: 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  a candidate tabl
ab10: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43  e and column.  C
ab20: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
ab30: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  hat.      ** tab
ab40: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  le and column is
ab50: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
ab60: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20   term in the OR 
ab70: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
ab80: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31  okToChngToIN = 1
ab90: 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e  ;.      for(; i>
aba0: 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f  =0 && okToChngTo
abb0: 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  IN; i--, pOrTerm
abc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
abd0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
abe0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
abf0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
ac00: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
ac10: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
ac20: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
ac30: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
ac40: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
ac50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
ac60: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
ac70: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
ac80: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
ac90: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
aca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
acb0: 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20     int affLeft, 
acc0: 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20  affRight;.      
acd0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69      /* If the ri
ace0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
acf0: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
ad00: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
ad10: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
ad20: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
ad30: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
ad40: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
ad50: 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20  no type.        
ad60: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
ad70: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
ad80: 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69   the right.  (Ti
ad90: 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20  cket #2249).    
ada0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
adb0: 20 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71     affRight = sq
adc0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
add0: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
ade0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
adf0: 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73       affLeft = s
ae00: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
ae10: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
ae20: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
ae30: 20 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68       if( affRigh
ae40: 74 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74  t!=0 && affRight
ae50: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
ae60: 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e           okToChn
ae70: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
ae80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ae90: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
aea0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
aeb0: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
aec0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
aed0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
aee0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
aef0: 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  t, okToChngToIN 
af00: 69 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69  is true if origi
af10: 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66  nal pTerm satisf
af20: 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  ies.    ** case 
af30: 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  1.  In that case
af40: 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  , construct a ne
af50: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74  w virtual term t
af60: 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70  hat is .    ** p
af70: 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69  Term converted i
af80: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
af90: 6f 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  or..    **.    *
afa0: 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35  * EV: R-00211-15
afb0: 31 30 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  100.    */.    i
afc0: 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  f( okToChngToIN 
afd0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
afe0: 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dup;            
aff0: 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64  /* A transient d
b000: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
b010: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
b020: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
b030: 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f  ;   /* The RHS o
b040: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
b050: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
b060: 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *pLeft = 0;     
b070: 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
b080: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
b090: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
b0a0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
b0b0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
b0c0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a  IN operator */..
b0d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
b0e0: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
b0f0: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
b100: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
b110: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
b120: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
b130: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
b140: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
b150: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b160: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
b170: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
b180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
b190: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
b1a0: 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20  r==iCursor );.  
b1b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
b1c0: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
b1d0: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a  umn==iColumn );.
b1e0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
b1f0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b200: 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
b210: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
b220: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71        pList = sq
b230: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
b240: 65 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c  end(pWC->pParse,
b250: 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20   pList, pDup);. 
b260: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70         pLeft = p
b270: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
b280: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Left;.      }.  
b290: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
b2a0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44  t!=0 );.      pD
b2b0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
b2c0: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
b2d0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
b2e0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b2f0: 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70  rse, TK_IN, pDup
b300: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
b310: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
b320: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
b330: 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a         transferJ
b340: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
b350: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
b360: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
b370: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
b380: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
b390: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
b3a0: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
b3b0: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
b3c0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
b3d0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54  ert(pWC, pNew, T
b3e0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
b3f0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
b400: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
b410: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
b420: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
b430: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
b440: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
b450: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
b460: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d  m];.        pWC-
b470: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65  >a[idxNew].iPare
b480: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
b490: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
b4a0: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ild = 1;.      }
b4b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b4c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
b4d0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
b4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
b4f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
b500: 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61   WO_NOOP;  /* ca
b510: 73 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65  se 1 trumps case
b520: 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a   2 */.    }.  }.
b530: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
b540: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
b550: 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c  MIZATION && !SQL
b560: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b570: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  Y */../*.** The 
b580: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
b590: 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72  utine is an Wher
b5a0: 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20  eTerm structure 
b5b0: 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  with only the.**
b5c0: 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66   "pExpr" field f
b5d0: 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a  illed in.  The j
b5e0: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
b5f0: 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65  ne is to analyze
b600: 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65   the.** subexpre
b610: 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61  ssion and popula
b620: 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  te all the other
b630: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57   fields of the W
b640: 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75  hereTerm.** stru
b650: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
b660: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
b670: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  s of the form "<
b680: 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74  expr> <op> X" it
b690: 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a   gets commuted.*
b6a0: 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72  * to the standar
b6b0: 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70  d form of "X <op
b6c0: 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a  > <expr>"..**.**
b6d0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
b6e0: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
b6f0: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
b700: 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20  re both X and Y 
b710: 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20  are.** columns, 
b720: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
b730: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  l expression is 
b740: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
b750: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
b760: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
b770: 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64  "Y <op> X" is ad
b780: 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ded to the WHERE
b790: 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61   clause and.** a
b7a0: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
b7b0: 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  ly.  The origina
b7c0: 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  l term is marked
b7d0: 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45   with TERM_COPIE
b7e0: 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77  D.** and the new
b7f0: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
b800: 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49  with TERM_DYNAMI
b810: 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20  C (because it's 
b820: 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74  pExpr.** needs t
b830: 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20  o be freed with 
b840: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29  the WhereClause)
b850: 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41   and TERM_VIRTUA
b860: 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a  L (because it.**
b870: 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63   is a commuted c
b880: 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74  opy of a prior t
b890: 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69  erm.)  The origi
b8a0: 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68  nal term has nCh
b8b0: 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65  ild=1.** and the
b8c0: 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72   copy has idxPar
b8d0: 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69  ent set to the i
b8e0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67  ndex of the orig
b8f0: 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  inal term..*/.st
b900: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
b910: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
b920: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
b930: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
b940: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
b950: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
b960: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
b970: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
b980: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
b990: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
b9a0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
b9b0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
b9c0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
b9d0: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
b9e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d       /* The term
b9f0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
ba00: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
ba10: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
ba20: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
ba30: 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b  table index mask
ba40: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  s */.  Expr *pEx
ba50: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
ba60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
ba70: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
ba80: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69  analyzed */.  Bi
ba90: 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74  tmask prereqLeft
baa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
bab0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
bac0: 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  of the pExpr->pL
bad0: 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  eft */.  Bitmask
bae0: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
baf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
bb00: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45  requesites of pE
bb10: 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  xpr */.  Bitmask
bb20: 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b   extraRight = 0;
bb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
bb40: 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ra dependencies 
bb50: 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a  on LEFT JOIN */.
bb60: 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20    Expr *pStr1 = 
bb70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
bb80: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
bb90: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
bba0: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  */.  int isCompl
bbb0: 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ete = 0;        
bbc0: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
bbd0: 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77  LIKE/GLOB ends w
bbe0: 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a  ith wildcard */.
bbf0: 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30    int noCase = 0
bc00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bc10: 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20     /* LIKE/GLOB 
bc20: 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63 61  distinguishes ca
bc30: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  se */.  int op; 
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d           /* Top-
bc60: 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20  level operator. 
bc70: 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20   pExpr->op */.  
bc80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
bc90: 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  pWC->pParse;    
bca0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
bcb0: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
bcc0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
bcd0: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  b;        /* Dat
bce0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
bcf0: 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
bd00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
bd10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
bd20: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
bd30: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61  [idxTerm];.  pMa
bd40: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
bd50: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
bd60: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
bd70: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
bd80: 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78  op!=TK_AS && pEx
bd90: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41  pr->op!=TK_COLLA
bda0: 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65  TE );.  prereqLe
bdb0: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
bdc0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
bdd0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
bde0: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
bdf0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
be00: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
be10: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
be20: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
be30: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
be40: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
be50: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
be60: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
be70: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
be80: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
be90: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
bea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
beb0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
bec0: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
bed0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
bee0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
bef0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
bf00: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
bf10: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
bf20: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
bf30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
bf40: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
bf50: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
bf60: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
bf70: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
bf80: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
bf90: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
bfa0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
bfb0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
bfc0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
bfd0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
bfe0: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
bff0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
c000: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
c010: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
c020: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
c030: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
c040: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
c050: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
c060: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
c070: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
c080: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
c090: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
c0a0: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
c0b0: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
c0c0: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
c0d0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
c0e0: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
c0f0: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
c100: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
c110: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
c120: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
c130: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b  allowedOp(op) ){
c140: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
c150: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
c160: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
c170: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70  >pLeft);.    Exp
c180: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
c190: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
c1a0: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
c1b0: 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73  );.    u16 opMas
c1c0: 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  k = (pTerm->prer
c1d0: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
c1e0: 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c  Left)==0 ? WO_AL
c1f0: 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  L : WO_EQUIV;.  
c200: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
c210: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
c220: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
c230: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
c240: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
c250: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
c260: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
c270: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
c280: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
c290: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f  atorMask(op) & o
c2a0: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  pMask;.    }.   
c2b0: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
c2c0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
c2d0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
c2e0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
c2f0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
c300: 0a 20 20 20 20 20 20 75 31 36 20 65 45 78 74 72  .      u16 eExtr
c310: 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aOp = 0;        
c320: 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20 66 6f  /* Extra bits fo
c330: 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f  r pNew->eOperato
c340: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
c350: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
c360: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
c370: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
c380: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
c390: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
c3a0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
c3b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
c3c0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
c3d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
c3e0: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
c3f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
c400: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c410: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
c420: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c430: 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49  C, pDup, TERM_VI
c440: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
c450: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IC);.        if(
c460: 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74   idxNew==0 ) ret
c470: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
c480: 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  w = &pWC->a[idxN
c490: 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew];.        pNe
c4a0: 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w->iParent = idx
c4b0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
c4c0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c4d0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
c4e0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
c4f0: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  1;.        pTerm
c500: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
c510: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
c520: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
c530: 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20 20 20  =TK_EQ.         
c540: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
c550: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
c560: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
c570: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
c580: 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
c590: 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29 0a 20  TE_Transitive). 
c5a0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
c5b0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
c5c0: 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56  ator |= WO_EQUIV
c5d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45 78 74  ;.          eExt
c5e0: 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b  raOp = WO_EQUIV;
c5f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c610: 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20  pDup = pExpr;.  
c620: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65        pNew = pTe
c630: 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
c640: 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50    exprCommute(pP
c650: 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20  arse, pDup);.   
c660: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
c670: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
c680: 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a  e(pDup->pLeft);.
c690: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
c6a0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
c6b0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
c6c0: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
c6d0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
c6e0: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
c6f0: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
c700: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
c710: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
c720: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
c730: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
c740: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
c750: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
c760: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
c770: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
c780: 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f 70 65  eOperator = (ope
c790: 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e  ratorMask(pDup->
c7a0: 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70 29 20  op) + eExtraOp) 
c7b0: 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  & opMask;.    }.
c7c0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
c7d0: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
c7e0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
c7f0: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
c800: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
c810: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
c820: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
c830: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
c840: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
c850: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
c860: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
c870: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
c880: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
c890: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
c8a0: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
c8b0: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
c8c0: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
c8d0: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
c8e0: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
c8f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
c900: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
c910: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
c920: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
c930: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
c940: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
c950: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
c960: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
c970: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
c980: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
c990: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
c9a0: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
c9b0: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
c9c0: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
c9d0: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
c9e0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
c9f0: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
ca00: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
ca10: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
ca20: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
ca30: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
ca40: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
ca50: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
ca60: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
ca70: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
ca80: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
ca90: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
caa0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
cab0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
cac0: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
cad0: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
cae0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
caf0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
cb00: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
cb10: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
cb20: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
cb30: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
cb40: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
cb50: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
cb60: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
cb70: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
cba0: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
cbb0: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cbe0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
cbf0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
cc00: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
cc10: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
cc20: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
cc30: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
cc40: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
cc50: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
cc60: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
cc70: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
cc80: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
cc90: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
cca0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
ccb0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
ccc0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
ccd0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
cce0: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
ccf0: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
cd00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
cd10: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
cd20: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
cd30: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
cd40: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
cd50: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
cd60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
cd70: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
cd80: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
cd90: 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20  hat is composed 
cda0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
cdb0: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
cdc0: 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20  d by.  ** an OR 
cdd0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
cde0: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
cdf0: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
ce00: 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f    assert( pWC->o
ce10: 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
ce20: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
ce30: 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  rm(pSrc, pWC, id
ce40: 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  xTerm);.    pTer
ce50: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
ce60: 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  erm];.  }.#endif
ce70: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ce80: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
ce90: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
cea0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
ceb0: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
cec0: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
ced0: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
cee0: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
cef0: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
cf00: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
cf10: 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74    ** A like patt
cf20: 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ern of the form 
cf30: 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20  "x LIKE 'abc%'" 
cf40: 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20  is changed into 
cf50: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
cf60: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78  .  **          x
cf70: 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61  >='abc' AND x<'a
cf80: 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  bd' AND x LIKE '
cf90: 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20  abc%'.  **.  ** 
cfa0: 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  The last charact
cfb0: 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  er of the prefix
cfc0: 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d   "abc" is increm
cfd0: 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  ented to form th
cfe0: 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69  e.  ** terminati
cff0: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62  on condition "ab
d000: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d"..  */.  if( p
d010: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a  WC->op==TK_AND .
d020: 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c     && isLikeOrGl
d030: 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
d040: 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d  , &pStr1, &isCom
d050: 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a  plete, &noCase).
d060: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
d070: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Left;       /* L
d080: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
d090: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
d0a0: 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20  Expr *pStr2;    
d0b0: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53     /* Copy of pS
d0c0: 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b  tr1 - RHS of LIK
d0d0: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
d0e0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  */.    Expr *pNe
d0f0: 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72  wExpr1;.    Expr
d100: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
d110: 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20   int idxNew1;.  
d120: 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20    int idxNew2;. 
d130: 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65     Token sCollSe
d140: 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  qName;  /* Name 
d150: 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  of collating seq
d160: 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c  uence */..    pL
d170: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
d180: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
d190: 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  ;.    pStr2 = sq
d1a0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
d1b0: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
d1c0: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
d1d0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
d1e0: 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20  8 c, *pC;       
d1f0: 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65  /* Last characte
d200: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
d210: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
d220: 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
d230: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pStr2->u.zToken[
d240: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
d250: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pStr2->u.zToken)
d260: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
d270: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
d280: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
d290: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20  /* The point is 
d2a0: 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
d2b0: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
d2c0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
d2d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64  .        ** wild
d2e0: 63 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65  card.  But if we
d2f0: 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20   increment '@', 
d300: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69  that will push i
d310: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  t into the.     
d320: 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63     ** alphabetic
d330: 20 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73   range where cas
d340: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69  e conversions wi
d350: 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a  ll mess up the .
d360: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75          ** inequ
d370: 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64  ality.  To avoid
d380: 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65   this, make sure
d390: 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65   to also run the
d3a0: 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   full.        **
d3b0: 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e   LIKE on all can
d3c0: 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f  didate expressio
d3d0: 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ns by clearing t
d3e0: 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c  he isComplete fl
d3f0: 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ag.        */.  
d400: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27        if( c=='A'
d410: 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20  -1 ) isComplete 
d420: 3d 20 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d  = 0;   /* EV: R-
d430: 36 34 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a  64339-08207 */..
d440: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
d450: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
d460: 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [c];.      }.   
d470: 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a     *pC = c + 1;.
d480: 20 20 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53      }.    sCollS
d490: 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73  eqName.z = noCas
d4a0: 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22  e ? "NOCASE" : "
d4b0: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 73 43 6f  BINARY";.    sCo
d4c0: 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b  llSeqName.n = 6;
d4d0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d  .    pNewExpr1 =
d4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
d4f0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
d500: 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
d510: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
d520: 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20  se, TK_GE, .    
d530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d540: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
d550: 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70  n(pParse,pNewExp
d560: 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  r1,&sCollSeqName
d570: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ),.           pS
d580: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78  tr1, 0);.    idx
d590: 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75  New1 = whereClau
d5a0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
d5b0: 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49  ewExpr1, TERM_VI
d5c0: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
d5d0: 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  IC);.    testcas
d5e0: 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b  e( idxNew1==0 );
d5f0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
d600: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
d610: 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  ew1);.    pNewEx
d620: 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr2 = sqlite3Exp
d630: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
d640: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
d650: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
d660: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a  (pParse, TK_LT,.
d670: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d680: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
d690: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65  Token(pParse,pNe
d6a0: 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71  wExpr2,&sCollSeq
d6b0: 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
d6c0: 20 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20    pStr2, 0);.   
d6d0: 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
d6e0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
d6f0: 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
d700: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
d710: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
d720: 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d  tcase( idxNew2==
d730: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
d740: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
d750: 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
d760: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
d770: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
d780: 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
d790: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
d7a0: 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
d7b0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
d7c0: 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
d7d0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
d7e0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
d7f0: 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
d800: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
d810: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
d820: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
d830: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d840: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
d850: 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41    /* Add a WO_MA
d860: 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65  TCH auxiliary te
d870: 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72  rm to the constr
d880: 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a  aint set if the.
d890: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70    ** current exp
d8a0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
d8b0: 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20  e form:  column 
d8c0: 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a  MATCH expr..  **
d8d0: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
d8e0: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
d8f0: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
d900: 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74  ods of.  ** virt
d910: 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ual tables.  The
d920: 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70   native query op
d930: 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74  timizer does not
d940: 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f   attempt.  ** to
d950: 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74   do anything wit
d960: 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e  h MATCH function
d970: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  s..  */.  if( is
d980: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45  MatchOfColumn(pE
d990: 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
d9a0: 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72  idxNew;.    Expr
d9b0: 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
d9c0: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
d9d0: 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42  *pNewTerm;.    B
d9e0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c  itmask prereqCol
d9f0: 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b  umn, prereqExpr;
da00: 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ..    pRight = p
da10: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
da20: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [0].pExpr;.    p
da30: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Left = pExpr->x.
da40: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
da50: 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70  r;.    prereqExp
da60: 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  r = exprTableUsa
da70: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69  ge(pMaskSet, pRi
da80: 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ght);.    prereq
da90: 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62  Column = exprTab
daa0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
dab0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
dac0: 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20  ( (prereqExpr & 
dad0: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30  prereqColumn)==0
dae0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
daf0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
db00: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
db10: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
db20: 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20  TK_MATCH, .     
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
db50: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
db60: 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20  Right, 0), 0);. 
db70: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
db80: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
db90: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
dba0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
dbb0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
dbc0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
dbd0: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  w==0 );.      pN
dbe0: 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
dbf0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
dc00: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
dc10: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78  Right = prereqEx
dc20: 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  pr;.      pNewTe
dc30: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
dc40: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
dc50: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
dc60: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
dc70: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
dc80: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
dc90: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41  Operator = WO_MA
dca0: 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  TCH;.      pNewT
dcb0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
dcc0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
dcd0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
dce0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
dcf0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
dd00: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
dd10: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
dd20: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
dd30: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
dd40: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
dd50: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
dd60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
dd70: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
dd80: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
dd90: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
dda0: 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65    /* When sqlite
ddb0: 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d  _stat3 histogram
ddc0: 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
ddd0: 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f  le an operator o
dde0: 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20  f the.  ** form 
ddf0: 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  "x IS NOT NULL" 
de00: 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65  can sometimes be
de10: 20 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20   evaluated more 
de20: 65 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a  efficiently.  **
de30: 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20   as "x>NULL" if 
de40: 78 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  x is not an INTE
de50: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
de60: 20 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61    So construct a
de70: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  .  ** virtual te
de80: 72 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e  rm of that form.
de90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
dea0: 74 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c  that the virtual
deb0: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61   term must be ta
dec0: 67 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56  gged with TERM_V
ded0: 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a  NULL.  This.  **
dee0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20   TERM_VNULL tag 
def0: 77 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68  will suppress th
df00: 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
df10: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
df20: 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f  g.  ** of the lo
df30: 6f 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65  op.  Without the
df40: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67   TERM_VNULL flag
df50: 2c 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63  , the not-null c
df60: 68 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65  heck at.  ** the
df70: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f   start of the lo
df80: 6f 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20  op will prevent 
df90: 61 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  any results from
dfa0: 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e   being returned.
dfb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
dfc0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op==TK_NOTNUL
dfd0: 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  L.   && pExpr->p
dfe0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
dff0: 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d  UMN.   && pExpr-
e000: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e  >pLeft->iColumn>
e010: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  =0.  ){.    Expr
e020: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
e030: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
e040: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
e050: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
e060: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54  WhereTerm *pNewT
e070: 65 72 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78  erm;..    pNewEx
e080: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
e090: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c  r(pParse, TK_GT,
e0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e0c0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
e0d0: 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20  pLeft, 0),.     
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 45         sqlite3PE
e100: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
e110: 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30  ULL, 0, 0, 0), 0
e120: 29 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d  );..    idxNew =
e130: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
e140: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
e150: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
e180: 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56  M_DYNAMIC|TERM_V
e190: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69  NULL);.    if( i
e1a0: 64 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70  dxNew ){.      p
e1b0: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
e1c0: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
e1d0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
e1e0: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  qRight = 0;.    
e1f0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
e200: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
e210: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
e220: 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  ewTerm->u.leftCo
e230: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
e240: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
e250: 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
e260: 20 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20   = WO_GT;.      
e270: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
e280: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
e290: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
e2a0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
e2b0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
e2c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
e2d0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
e2e0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
e2f0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
e300: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
e310: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
e320: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
e330: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20  ITE_ENABLE_STAT 
e340: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
e350: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
e360: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
e370: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
e380: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
e390: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
e3a0: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
e3b0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
e3c0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
e3d0: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
e3e0: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ht;.}../*.** Thi
e3f0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
e400: 68 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  hes the expressi
e410: 6f 6e 20 6c 69 73 74 20 70 61 73 73 65 64 20 61  on list passed a
e420: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
e430: 75 6d 65 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 20  ument.** for an 
e440: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 79  expression of ty
e450: 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61  pe TK_COLUMN tha
e460: 74 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20  t refers to the 
e470: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a  same column and.
e480: 2a 2a 20 75 73 65 73 20 74 68 65 20 73 61 6d 65  ** uses the same
e490: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
e4a0: 6e 63 65 20 61 73 20 74 68 65 20 69 43 6f 6c 27  nce as the iCol'
e4b0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  th column of ind
e4c0: 65 78 20 70 49 64 78 2e 0a 2a 2a 20 41 72 67 75  ex pIdx..** Argu
e4d0: 6d 65 6e 74 20 69 42 61 73 65 20 69 73 20 74 68  ment iBase is th
e4e0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
e4f0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  used for the tab
e500: 6c 65 20 74 68 61 74 20 70 49 64 78 20 72 65 66  le that pIdx ref
e510: 65 72 73 0a 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a  ers.** to..**.**
e520: 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
e530: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
e540: 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
e550: 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
e560: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
e570: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
e580: 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
e590: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
e5a0: 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
e5b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
e5e0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
e5f0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
e600: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
e610: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
e620: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
e630: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
e640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
e650: 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
e660: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
e670: 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
e680: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
e690: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
e6a0: 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
e6b0: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
e6c0: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
e6d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
e6e0: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
e6f0: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
e700: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
e710: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
e720: 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
e730: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
e740: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
e750: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
e760: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
e770: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
e780: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
e790: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
e7a0: 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
e7b0: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
e7c0: 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
e7d0: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
e7e0: 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
e7f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
e800: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
e810: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
e820: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
e830: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
e840: 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73  S(pColl) && 0==s
e850: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
e860: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  oll->zName, zCol
e870: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  l) ){.        re
e880: 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a  turn i;.      }.
e890: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
e8a0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
e8b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65   This routine de
e8c0: 74 65 72 6d 69 6e 65 73 20 69 66 20 70 49 64 78  termines if pIdx
e8d0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
e8e0: 61 73 73 69 73 74 20 69 6e 20 70 72 6f 63 65 73  assist in proces
e8f0: 73 69 6e 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e  sing a.** DISTIN
e900: 43 54 20 71 75 61 6c 69 66 69 65 72 2e 20 49 6e  CT qualifier. In
e910: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
e920: 20 74 65 73 74 73 20 77 68 65 74 68 65 72 20 6f   tests whether o
e930: 72 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 69 73  r not using this
e940: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
e950: 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 67 75 61  e outer loop gua
e960: 72 61 6e 74 65 65 73 20 74 68 61 74 20 72 6f 77  rantees that row
e970: 73 20 77 69 74 68 20 65 71 75 61 6c 20 76 61 6c  s with equal val
e980: 75 65 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65  ues for.** all e
e990: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
e9a0: 65 20 70 44 69 73 74 69 6e 63 74 20 6c 69 73 74  e pDistinct list
e9b0: 20 61 72 65 20 64 65 6c 69 76 65 72 65 64 20 67   are delivered g
e9c0: 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
e9d0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
e9e0: 6c 65 2c 20 74 68 65 20 71 75 65 72 79 20 0a 2a  le, the query .*
e9f0: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 44 49  *.**   SELECT DI
ea00: 53 54 49 4e 43 54 20 61 2c 20 62 2c 20 63 20 46  STINCT a, b, c F
ea10: 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20  ROM tbl WHERE a 
ea20: 3d 20 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65  = ?.**.** can be
ea30: 6e 65 66 69 74 20 66 72 6f 6d 20 61 6e 79 20 69  nefit from any i
ea40: 6e 64 65 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20  ndex on columns 
ea50: 22 62 22 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a  "b" and "c"..*/.
ea60: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
ea70: 74 69 6e 63 74 49 6e 64 65 78 28 0a 20 20 50 61  tinctIndex(.  Pa
ea80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eaa0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
eab0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
eac0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
ead0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
eae0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49  RE clause */.  I
eaf0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb10: 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e  * The index bein
eb20: 67 20 63 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a  g considered */.
eb30: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
eb60: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
eb70: 20 70 49 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20   pIdx is on */. 
eb80: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
eb90: 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  inct,           
eba0: 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54   /* The DISTINCT
ebb0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
ebc0: 20 20 69 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20    int nEqCol    
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
ebf0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74  ndex columns wit
ec00: 68 20 3d 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74  h == */.){.  Bit
ec10: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20  mask mask = 0;  
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec30: 4d 61 73 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e  Mask of unaccoun
ec40: 74 65 64 20 66 6f 72 20 70 44 69 73 74 69 6e 63  ted for pDistinc
ec50: 74 20 65 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74  t exprs */.  int
ec60: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec80: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
ec90: 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
eca0: 70 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a  pDistinct!=0 );.
ecb0: 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d    if( pIdx->zNam
ecc0: 65 3d 3d 30 20 7c 7c 20 70 44 69 73 74 69 6e 63  e==0 || pDistinc
ecd0: 74 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20  t->nExpr>=BMS ) 
ece0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74  return 0;.  test
ecf0: 63 61 73 65 28 20 70 44 69 73 74 69 6e 63 74 2d  case( pDistinct-
ed00: 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b  >nExpr==BMS-1 );
ed10: 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
ed20: 75 67 68 20 61 6c 6c 20 74 68 65 20 65 78 70 72  ugh all the expr
ed30: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 64  essions in the d
ed40: 69 73 74 69 6e 63 74 20 6c 69 73 74 2e 20 49 66  istinct list. If
ed50: 20 61 6e 79 20 6f 66 20 74 68 65 6d 0a 20 20 2a   any of them.  *
ed60: 2a 20 61 72 65 20 6e 6f 74 20 73 69 6d 70 6c 65  * are not simple
ed70: 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63   column referenc
ed80: 65 73 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  es, return early
ed90: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 65 73  . Otherwise, tes
eda0: 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  t if the.  ** WH
edb0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
edc0: 69 6e 73 20 61 20 22 63 6f 6c 3d 58 22 20 63 6c  ins a "col=X" cl
edd0: 61 75 73 65 2e 20 49 66 20 69 74 20 64 6f 65 73  ause. If it does
ede0: 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
edf0: 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e  .  ** can be ign
ee00: 6f 72 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73  ored. If it does
ee10: 20 6e 6f 74 2c 20 61 6e 64 20 74 68 65 20 63 6f   not, and the co
ee20: 6c 75 6d 6e 20 64 6f 65 73 20 6e 6f 74 20 62 65  lumn does not be
ee30: 6c 6f 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a  long to the.  **
ee40: 20 73 61 6d 65 20 74 61 62 6c 65 20 61 73 20 69   same table as i
ee50: 6e 64 65 78 20 70 49 64 78 2c 20 72 65 74 75 72  ndex pIdx, retur
ee60: 6e 20 65 61 72 6c 79 2e 20 46 69 6e 61 6c 6c 79  n early. Finally
ee70: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  , if there is no
ee80: 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20 22  .  ** matching "
ee90: 63 6f 6c 3d 58 22 20 65 78 70 72 65 73 73 69 6f  col=X" expressio
eea0: 6e 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e  n and the column
eeb0: 20 69 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20   is on the same 
eec0: 74 61 62 6c 65 20 61 73 20 70 49 64 78 2c 0a 20  table as pIdx,. 
eed0: 20 2a 2a 20 73 65 74 20 74 68 65 20 63 6f 72 72   ** set the corr
eee0: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
eef0: 20 76 61 72 69 61 62 6c 65 20 6d 61 73 6b 2e 0a   variable mask..
ef00: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
ef10: 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78  i<pDistinct->nEx
ef20: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 57 68  pr; i++){.    Wh
ef30: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
ef40: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
ef50: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
ef60: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
ef70: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
ef80: 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43   if( p->op!=TK_C
ef90: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
efa0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  ;.    pTerm = fi
efb0: 6e 64 54 65 72 6d 28 70 57 43 2c 20 70 2d 3e 69  ndTerm(pWC, p->i
efc0: 54 61 62 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75 6d  Table, p->iColum
efd0: 6e 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  n, ~(Bitmask)0, 
efe0: 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 20 20 69  WO_EQ, 0);.    i
eff0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
f000: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
f010: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
f020: 20 43 6f 6c 6c 53 65 71 20 2a 70 31 20 3d 20 73   CollSeq *p1 = s
f030: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
f040: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
f050: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
f060: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
f070: 20 43 6f 6c 6c 53 65 71 20 2a 70 32 20 3d 20 73   CollSeq *p2 = s
f080: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
f090: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
f0a0: 20 20 20 20 69 66 28 20 70 31 3d 3d 70 32 20 29      if( p1==p2 )
f0b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
f0c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
f0d0: 6c 65 21 3d 62 61 73 65 20 29 20 72 65 74 75 72  le!=base ) retur
f0e0: 6e 20 30 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  n 0;.    mask |=
f0f0: 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c   (((Bitmask)1) <
f100: 3c 20 69 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  < i);.  }..  for
f110: 28 69 3d 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b 20  (i=nEqCol; mask 
f120: 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  && i<pIdx->nColu
f130: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  mn; i++){.    in
f140: 74 20 69 45 78 70 72 20 3d 20 66 69 6e 64 49 6e  t iExpr = findIn
f150: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
f160: 44 69 73 74 69 6e 63 74 2c 20 62 61 73 65 2c 20  Distinct, base, 
f170: 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 69 66  pIdx, i);.    if
f180: 28 20 69 45 78 70 72 3c 30 20 29 20 62 72 65 61  ( iExpr<0 ) brea
f190: 6b 3b 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e  k;.    mask &= ~
f1a0: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c  (((Bitmask)1) <<
f1b0: 20 69 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20   iExpr);.  }..  
f1c0: 72 65 74 75 72 6e 20 28 6d 61 73 6b 3d 3d 30 29  return (mask==0)
f1d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
f1e0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
f1f0: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
f200: 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
f210: 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
f220: 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
f230: 64 61 6e 74 2e 20 41 20 44 49 53 54 49 4e 43 54  dant. A DISTINCT
f240: 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61   list is redunda
f250: 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nt if the databa
f260: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  se contains a.**
f270: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 74 68   UNIQUE index th
f280: 61 74 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  at guarantees th
f290: 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  at the result of
f2a0: 20 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20   the query will 
f2b0: 62 65 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61  be distinct.** a
f2c0: 6e 79 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  nyway..*/.static
f2d0: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
f2e0: 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
f2f0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 72 63  e *pParse,.  Src
f300: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a  List *pTabList,.
f310: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
f320: 57 43 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  WC,.  ExprList *
f330: 70 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54  pDistinct.){.  T
f340: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
f350: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
f360: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
f380: 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a  int iBase;..  /*
f390: 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72   If there is mor
f3a0: 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65  e than one table
f3b0: 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69   or sub-select i
f3c0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
f3d0: 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71  e of.  ** this q
f3e0: 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69  uery, then it wi
f3f0: 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
f400: 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20  le to show that 
f410: 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20  the DISTINCT .  
f420: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64  ** clause is red
f430: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  undant. */.  if(
f440: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21   pTabList->nSrc!
f450: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
f460: 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73   iBase = pTabLis
f470: 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  t->a[0].iCursor;
f480: 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69  .  pTab = pTabLi
f490: 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  st->a[0].pTab;..
f4a0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    /* If any of t
f4b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
f4c0: 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20  s an IPK column 
f4d0: 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20  on table iBase, 
f4e0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a  then return .  *
f4f0: 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68  * true. Note: Th
f500: 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  e (p->iTable==iB
f510: 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69  ase) part of thi
f520: 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61  s test may be fa
f530: 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  lse if the.  ** 
f540: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
f550: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
f560: 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  ub-query..  */. 
f570: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73   for(i=0; i<pDis
f580: 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  tinct->nExpr; i+
f590: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
f5a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
f5b0: 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e  pCollate(pDistin
f5c0: 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  ct->a[i].pExpr);
f5d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
f5e0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e  TK_COLUMN && p->
f5f0: 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26  iTable==iBase &&
f600: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20   p->iColumn<0 ) 
f610: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
f620: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
f630: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20   all indices on 
f640: 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b  the table, check
f650: 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65 20  ing each to see 
f660: 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a  if it makes.  **
f670: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75   the DISTINCT qu
f680: 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e  alifier redundan
f690: 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66  t. It does so if
f6a0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
f6b0: 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69 74   The index is it
f6c0: 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64  self UNIQUE, and
f6d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
f6e0: 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  All of the colum
f6f0: 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
f700: 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74 20  are either part 
f710: 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63 74  of the pDistinct
f720: 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c  .  **      list,
f730: 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48 45   or else the WHE
f740: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
f750: 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  ns a term of the
f760: 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20   form "col=X",. 
f770: 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20 58   **      where X
f780: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76   is a constant v
f790: 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74  alue. The collat
f7a0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66  ion sequences of
f7b0: 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63   the.  **      c
f7c0: 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65  omparison and se
f7d0: 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73  lect-list expres
f7e0: 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68  sions must match
f7f0: 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e   those of the in
f800: 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  dex..  **.  **  
f810: 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65   3. All of those
f820: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66   index columns f
f830: 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45  or which the WHE
f840: 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  RE clause does n
f850: 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e  ot.  **      con
f860: 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74  tain a "col=X" t
f870: 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20  erm are subject 
f880: 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  to a NOT NULL co
f890: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
f8a0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
f8b0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
f8c0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
f8d0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f  .    if( pIdx->o
f8e0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
f8f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
f900: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
f910: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
f920: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
f930: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
f940: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i];.      if( 0=
f950: 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69  =findTerm(pWC, i
f960: 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69  Base, iCol, ~(Bi
f970: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
f980: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
f990: 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66   int iIdxCol = f
f9a0: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72  indIndexCol(pPar
f9b0: 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69  se, pDistinct, i
f9c0: 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a  Base, pIdx, i);.
f9d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64 78          if( iIdx
f9e0: 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61  Col<0 || pTab->a
f9f0: 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75  Col[pIdx->aiColu
fa00: 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  mn[i]].notNull==
fa10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
fa20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
fa30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fa40: 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e    if( i==pIdx->n
fa50: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
fa60: 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d  /* This index im
fa70: 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44  plies that the D
fa80: 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
fa90: 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  r is redundant. 
faa0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
fab0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
fac0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
fad0: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75  ** Prepare a cru
fae0: 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  de estimate of t
faf0: 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  he logarithm of 
fb00: 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e  the input value.
fb10: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
fb20: 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63  need not be exac
fb30: 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  t.  This is only
fb40: 20 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61   used for estima
fb50: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61  ting.** the tota
fb60: 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72  l cost of perfor
fb70: 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  ming operations 
fb80: 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20  with O(logN) or 
fb90: 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70  O(NlogN).** comp
fba0: 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65  lexity.  Because
fbb0: 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65   N is just a gue
fbc0: 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65  ss, it is no gre
fbd0: 61 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a  at tragedy if.**
fbe0: 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c   logN is a littl
fbf0: 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  e off..*/.static
fc00: 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64   double estLog(d
fc10: 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62  ouble N){.  doub
fc20: 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64  le logN = 1;.  d
fc30: 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20  ouble x = 10;.  
fc40: 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20  while( N>x ){.  
fc50: 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20    logN += 1;.   
fc60: 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20   x *= 10;.  }.  
fc70: 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a  return logN;.}..
fc80: 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
fc90: 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
fca0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
fcb0: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
fcc0: 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
fcd0: 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
fce0: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
fcf0: 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
fd00: 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
fd10: 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
fd20: 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
fd30: 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
fd40: 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
fd50: 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
fd60: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fd70: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
fd80: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
fd90: 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
fda0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
fdb0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
fdc0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
fdd0: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
fde0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
fdf0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
fe00: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
fe10: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
fe20: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
fe30: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
fe40: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
fe50: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
fe60: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
fe70: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
fe80: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
fe90: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
fea0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
feb0: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
fec0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
fed0: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
fee0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
fef0: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
ff00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
ff10: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
ff20: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
ff30: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
ff40: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
ff50: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
ff60: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
ff70: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
ff80: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
ff90: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
ffa0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
ffb0: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
ffc0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
ffd0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
ffe0: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
fff0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
10000 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
10010 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
10020 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
10030 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
10040 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
10050 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
10060 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
10070 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
10080 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
10090 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
100a0 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
100b0 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
100c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
100d0 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
100e0 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
100f0 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
10100 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
10110 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
10120 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
10130 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
10140 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
10150 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
10160 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
10170 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
10180 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
10190 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
101a0 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c  atedCost);.}.#el
101b0 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
101c0 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
101d0 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
101e0 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
101f0 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69  if../* .** Requi
10200 72 65 64 20 62 65 63 61 75 73 65 20 62 65 73 74  red because best
10210 49 6e 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65  Index() is calle
10220 64 20 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73  d by bestOrClaus
10230 65 49 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61  eIndex() .*/.sta
10240 74 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64  tic void bestInd
10250 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 2a  ex(WhereBestIdx*
10260 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  );../*.** This r
10270 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
10280 74 6f 20 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e  to find an scann
10290 69 6e 67 20 73 74 72 61 74 65 67 79 20 74 68 61  ing strategy tha
102a0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a 2a  t can be used .*
102b0 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e  * to optimize an
102c0 20 27 4f 52 27 20 65 78 70 72 65 73 73 69 6f 6e   'OR' expression
102d0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
102e0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
102f0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c   .**.** The tabl
10300 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
10310 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  h FROM clause te
10320 72 6d 20 70 53 72 63 20 6d 61 79 20 62 65 20 65  rm pSrc may be e
10330 69 74 68 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c  ither a.** regul
10340 61 72 20 42 2d 54 72 65 65 20 74 61 62 6c 65 20  ar B-Tree table 
10350 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  or a virtual tab
10360 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
10370 69 64 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49  id bestOrClauseI
10380 6e 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64  ndex(WhereBestId
10390 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
103a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
103b0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 57 68 65  TIMIZATION.  Whe
103c0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20  reClause *pWC = 
103d0 70 2d 3e 70 57 43 3b 20 20 20 20 20 20 20 20 20  p->pWC;         
103e0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
103f0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
10400 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
10410 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
10420 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
10430 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
10440 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  h */.  const int
10450 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43   iCur = pSrc->iC
10460 75 72 73 6f 72 3b 20 20 20 20 20 20 2f 2a 20 54  ursor;      /* T
10470 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
10480 20 74 61 62 6c 65 20 20 2a 2f 0a 20 20 63 6f 6e   table  */.  con
10490 73 74 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53  st Bitmask maskS
104a0 72 63 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43  rc = getMask(pWC
104b0 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->pMaskSet, iCur
104c0 29 3b 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66  );  /* Bitmask f
104d0 6f 72 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65  or pSrc */.  Whe
104e0 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
104f0 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
10500 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20  pWC->nTerm];    
10510 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
10520 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  C->a[] */.  Wher
10530 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
10560 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
10570 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54  lause */..  /* T
10580 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 6f 70 74  he OR-clause opt
10590 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 64 69 73  imization is dis
105a0 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20 49  allowed if the I
105b0 4e 44 45 58 45 44 20 42 59 20 6f 72 0a 20 20 2a  NDEXED BY or.  *
105c0 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  * NOT INDEXED cl
105d0 61 75 73 65 73 20 61 72 65 20 75 73 65 64 20 6f  auses are used o
105e0 72 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 41  r if the WHERE_A
105f0 4e 44 5f 4f 4e 4c 59 20 62 69 74 20 69 73 20 73  ND_ONLY bit is s
10600 65 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  et. */.  if( pSr
10610 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 7c 7c  c->notIndexed ||
10620 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 21 3d 30   pSrc->pIndex!=0
10630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
10640 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 77    }.  if( pWC->w
10650 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
10660 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_AND_ONLY ){.  
10670 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
10680 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 57   /* Search the W
10690 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
106a0 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57  s for a usable W
106b0 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  O_OR term. */.  
106c0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
106d0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
106e0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
106f0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
10700 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a  tor & WO_OR)!=0.
10710 20 20 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d       && ((pTerm-
10720 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61  >prereqAll & ~ma
10730 73 6b 53 72 63 29 20 26 20 70 2d 3e 6e 6f 74 52  skSrc) & p->notR
10740 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 26 26  eady)==0.     &&
10750 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
10760 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
10770 6d 61 73 6b 53 72 63 29 21 3d 30 20 0a 20 20 20  maskSrc)!=0 .   
10780 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
10790 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
107a0 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
107b0 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
107c0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
107d0 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
107e0 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
107f0 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
10800 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
10810 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  m;.      int fla
10820 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs = WHERE_MULTI
10830 5f 4f 52 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  _OR;.      doubl
10840 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  e rTotal = 0;.  
10850 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 20      double nRow 
10860 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  = 0;.      Bitma
10870 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20  sk used = 0;.   
10880 20 20 20 57 68 65 72 65 42 65 73 74 49 64 78 20     WhereBestIdx 
10890 73 42 4f 49 3b 0a 0a 20 20 20 20 20 20 73 42 4f  sBOI;..      sBO
108a0 49 20 3d 20 2a 70 3b 0a 20 20 20 20 20 20 73 42  I = *p;.      sB
108b0 4f 49 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  OI.pOrderBy = 0;
108c0 0a 20 20 20 20 20 20 73 42 4f 49 2e 70 44 69 73  .      sBOI.pDis
108d0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
108e0 20 73 42 4f 49 2e 70 70 49 64 78 49 6e 66 6f 20   sBOI.ppIdxInfo 
108f0 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  = 0;.      for(p
10900 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
10910 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
10920 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
10930 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
10940 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e  E(("... Multi-in
10950 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20 66  dex OR testing f
10960 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25 64  or term %d of %d
10970 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20  ....\n", .      
10980 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d 20 70      (pOrTerm - p
10990 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d  OrWC->a), (pTerm
109a0 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20 20 20   - pWC->a).     
109b0 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20 69     ));.        i
109c0 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
109d0 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21  erator& WO_AND)!
109e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
109f0 73 42 4f 49 2e 70 57 43 20 3d 20 26 70 4f 72 54  sBOI.pWC = &pOrT
10a00 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
10a10 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >wc;.          b
10a20 65 73 74 49 6e 64 65 78 28 26 73 42 4f 49 29 3b  estIndex(&sBOI);
10a30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10a40 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
10a50 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
10a60 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
10a70 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
10a80 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
10a90 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
10aa0 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74  rse;.          t
10ab0 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d  empWC.pMaskSet =
10ac0 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
10ad0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
10ae0 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
10af0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
10b00 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
10b10 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
10b20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
10b30 20 20 20 20 20 74 65 6d 70 57 43 2e 77 63 74 72       tempWC.wctr
10b40 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  lFlags = 0;.    
10b50 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
10b60 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
10b70 20 20 73 42 4f 49 2e 70 57 43 20 3d 20 26 74 65    sBOI.pWC = &te
10b80 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20  mpWC;.          
10b90 62 65 73 74 49 6e 64 65 78 28 26 73 42 4f 49 29  bestIndex(&sBOI)
10ba0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10bb0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
10bc0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
10bd0 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d         rTotal +=
10be0 20 73 42 4f 49 2e 63 6f 73 74 2e 72 43 6f 73 74   sBOI.cost.rCost
10bf0 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b  ;.        nRow +
10c00 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 70 6c 61 6e  = sBOI.cost.plan
10c10 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 75  .nRow;.        u
10c20 73 65 64 20 7c 3d 20 73 42 4f 49 2e 63 6f 73 74  sed |= sBOI.cost
10c30 2e 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  .used;.        i
10c40 66 28 20 72 54 6f 74 61 6c 3e 3d 70 2d 3e 63 6f  f( rTotal>=p->co
10c50 73 74 2e 72 43 6f 73 74 20 29 20 62 72 65 61 6b  st.rCost ) break
10c60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10c70 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
10c80 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
10c90 73 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  se, increase the
10ca0 20 73 63 61 6e 20 63 6f 73 74 20 74 6f 20 61 63   scan cost to ac
10cb0 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  count .      ** 
10cc0 66 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20  for the cost of 
10cd0 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20  the sort. */.   
10ce0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
10cf0 42 79 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By!=0 ){.       
10d00 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
10d10 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61  . sorting increa
10d20 73 65 73 20 4f 52 20 63 6f 73 74 20 25 2e 39 67  ses OR cost %.9g
10d30 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20   to %.9g\n",.   
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 72 54 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b   rTotal, rTotal+
10d60 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  nRow*estLog(nRow
10d70 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 54 6f  )));.        rTo
10d80 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c  tal += nRow*estL
10d90 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  og(nRow);.      
10da0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
10db0 68 65 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e  he cost of scann
10dc0 69 6e 67 20 75 73 69 6e 67 20 74 68 69 73 20 4f  ing using this O
10dd0 52 20 74 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d  R term for optim
10de0 69 7a 61 74 69 6f 6e 20 69 73 0a 20 20 20 20 20  ization is.     
10df0 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68   ** less than th
10e00 65 20 63 75 72 72 65 6e 74 20 63 6f 73 74 20 73  e current cost s
10e10 74 6f 72 65 64 20 69 6e 20 70 43 6f 73 74 2c 20  tored in pCost, 
10e20 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  replace the cont
10e30 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ents.      ** of
10e40 20 70 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20   pCost. */.     
10e50 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
10e60 2e 20 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52  . multi-index OR
10e70 20 63 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d   cost=%.9g nrow=
10e80 25 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c  %.9g\n", rTotal,
10e90 20 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69   nRow));.      i
10ea0 66 28 20 72 54 6f 74 61 6c 3c 70 2d 3e 63 6f 73  f( rTotal<p->cos
10eb0 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  t.rCost ){.     
10ec0 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74     p->cost.rCost
10ed0 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20   = rTotal;.     
10ee0 20 20 20 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20     p->cost.used 
10ef0 3d 20 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20  = used;.        
10f00 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f  p->cost.plan.nRo
10f10 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20  w = nRow;.      
10f20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e    p->cost.plan.n
10f30 4f 42 53 61 74 20 3d 20 70 2d 3e 69 20 3f 20 70  OBSat = p->i ? p
10f40 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
10f50 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3a 20 30  .plan.nOBSat : 0
10f60 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73  ;.        p->cos
10f70 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  t.plan.wsFlags =
10f80 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
10f90 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70  p->cost.plan.u.p
10fa0 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  Term = pTerm;.  
10fb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10fc0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10fd0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
10fe0 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e  ATION */.}..#ifn
10ff0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11000 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
11010 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
11020 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
11030 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
11040 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
11050 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
11060 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
11070 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
11080 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
11090 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
110a0 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
110b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
110c0 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
110d0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
110e0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
110f0 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
11100 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
11110 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
11120 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
11130 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
11140 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
11150 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
11160 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
11170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
11180 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
11190 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
111a0 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
111b0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
111c0 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
111d0 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
111e0 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
111f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
11200 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  EQ)==0 ) return 
11210 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
11220 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
11230 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
11240 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
11250 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
11260 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
11270 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
11280 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
11290 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
112a0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
112b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
112c0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
112d0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
112e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
112f0 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 49 66 20  _INDEX./*.** If 
11300 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66  the query plan f
11310 6f 72 20 70 53 72 63 20 73 70 65 63 69 66 69 65  or pSrc specifie
11320 64 20 69 6e 20 70 43 6f 73 74 20 69 73 20 61 20  d in pCost is a 
11330 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 0a  full table scan.
11340 2a 2a 20 61 6e 64 20 69 6e 64 65 78 69 6e 67 20  ** and indexing 
11350 69 73 20 61 6c 6c 6f 77 73 20 28 69 66 20 74 68  is allows (if th
11360 65 72 65 20 69 73 20 6e 6f 20 4e 4f 54 20 49 4e  ere is no NOT IN
11370 44 45 58 45 44 20 63 6c 61 75 73 65 29 20 61 6e  DEXED clause) an
11380 64 20 69 74 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  d it.** possible
11390 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
113a0 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
113b0 74 68 61 74 20 77 6f 75 6c 64 20 70 65 72 66 6f  that would perfo
113c0 72 6d 20 62 65 74 74 65 72 0a 2a 2a 20 74 68 61  rm better.** tha
113d0 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  n a full table s
113e0 63 61 6e 20 65 76 65 6e 20 77 68 65 6e 20 74 68  can even when th
113f0 65 20 63 6f 73 74 20 6f 66 20 63 6f 6e 73 74 72  e cost of constr
11400 75 63 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  ucting the index
11410 0a 2a 2a 20 69 73 20 74 61 6b 65 6e 20 69 6e 74  .** is taken int
11420 6f 20 61 63 63 6f 75 6e 74 2c 20 74 68 65 6e 20  o account, then 
11430 61 6c 74 65 72 20 74 68 65 20 71 75 65 72 79 20  alter the query 
11440 70 6c 61 6e 20 74 6f 20 75 73 65 20 74 68 65 0a  plan to use the.
11450 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
11460 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
11470 69 64 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63  id bestAutomatic
11480 49 6e 64 65 78 28 57 68 65 72 65 42 65 73 74 49  Index(WhereBestI
11490 64 78 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  dx *p){.  Parse 
114a0 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
114b0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
114c0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
114d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
114e0 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70  eClause *pWC = p
114f0 2d 3e 70 57 43 3b 20 20 20 20 20 20 20 20 20 20  ->pWC;          
11500 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
11510 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
11520 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
11530 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
11540 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
11550 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
11560 63 68 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e  ch */.  double n
11570 54 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20 20  TableRow;       
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11590 20 52 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 70   Rows in the inp
115a0 75 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 64 6f  ut table */.  do
115b0 75 62 6c 65 20 6c 6f 67 4e 3b 20 20 20 20 20 20  uble logN;      
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c      /* log(nTabl
115e0 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62 6c  eRow) */.  doubl
115f0 65 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 20 20  e costTempIdx;  
11600 20 20 20 20 20 20 20 2f 2a 20 70 65 72 2d 71 75         /* per-qu
11610 65 72 79 20 63 6f 73 74 20 6f 66 20 74 68 65 20  ery cost of the 
11620 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
11630 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
11640 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
11650 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
11660 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
11670 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
11680 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
11690 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
116a0 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54   pWC->a[] */.  T
116b0 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20  able *pTable;   
116c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
116d0 62 6c 65 20 74 68 74 20 6d 69 67 68 74 20 62 65  ble tht might be
116e0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 69   indexed */..  i
116f0 66 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  f( pParse->nQuer
11700 79 4c 6f 6f 70 3c 3d 28 64 6f 75 62 6c 65 29 31  yLoop<=(double)1
11710 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
11720 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
11730 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f  building an auto
11740 6d 61 74 69 63 20 69 6e 64 65 78 20 66 6f 72 20  matic index for 
11750 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 2a 2f  a single scan */
11760 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11770 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
11780 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
11790 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 3d 3d 30  TE_AutoIndex)==0
117a0 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d   ){.    /* Autom
117b0 61 74 69 63 20 69 6e 64 69 63 65 73 20 61 72 65  atic indices are
117c0 20 64 69 73 61 62 6c 65 64 20 61 74 20 72 75 6e   disabled at run
117d0 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20 72 65 74  -time */.    ret
117e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  urn;.  }.  if( (
117f0 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  p->cost.plan.wsF
11800 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
11810 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 0a 20 20  _FULLSCAN)!=0.  
11820 20 26 26 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61   && (p->cost.pla
11830 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
11840 45 5f 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30  E_COVER_SCAN)==0
11850 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  .  ){.    /* We 
11860 61 6c 72 65 61 64 79 20 68 61 76 65 20 73 6f 6d  already have som
11870 65 20 6b 69 6e 64 20 6f 66 20 69 6e 64 65 78 20  e kind of index 
11880 69 6e 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  in use for this 
11890 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 72 65  query. */.    re
118a0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
118b0 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69  pSrc->viaCorouti
118c0 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 6e  ne ){.    /* Can
118d0 6e 6f 74 20 69 6e 64 65 78 20 61 20 63 6f 2d 72  not index a co-r
118e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 72 65  outine */.    re
118f0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
11900 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
11910 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4e   ){.    /* The N
11920 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
11930 65 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  e appears in the
11940 20 53 51 4c 2e 20 2a 2f 0a 20 20 20 20 72 65 74   SQL. */.    ret
11950 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
11960 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  Src->isCorrelate
11970 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
11980 73 6f 75 72 63 65 20 69 73 20 61 20 63 6f 72 72  source is a corr
11990 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
119a0 2e 20 4e 6f 20 70 6f 69 6e 74 20 69 6e 20 69 6e  . No point in in
119b0 64 65 78 69 6e 67 20 69 74 2e 20 2a 2f 0a 20 20  dexing it. */.  
119c0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
119d0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
119e0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3e 3d 20 28  >nQueryLoop >= (
119f0 64 6f 75 62 6c 65 29 31 20 29 3b 0a 20 20 70 54  double)1 );.  pT
11a00 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
11a10 62 3b 0a 20 20 6e 54 61 62 6c 65 52 6f 77 20 3d  b;.  nTableRow =
11a20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74   pTable->nRowEst
11a30 3b 0a 20 20 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f  ;.  logN = estLo
11a40 67 28 6e 54 61 62 6c 65 52 6f 77 29 3b 0a 20 20  g(nTableRow);.  
11a50 63 6f 73 74 54 65 6d 70 49 64 78 20 3d 20 32 2a  costTempIdx = 2*
11a60 6c 6f 67 4e 2a 28 6e 54 61 62 6c 65 52 6f 77 2f  logN*(nTableRow/
11a70 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
11a80 6f 70 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 63  op + 1);.  if( c
11a90 6f 73 74 54 65 6d 70 49 64 78 3e 3d 70 2d 3e 63  ostTempIdx>=p->c
11aa0 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20  ost.rCost ){.   
11ab0 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
11ac0 63 72 65 61 74 69 6e 67 20 74 68 65 20 74 72 61  creating the tra
11ad0 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 77 6f 75  nsient table wou
11ae0 6c 64 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ld be greater th
11af0 61 6e 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  an.    ** doing 
11b00 74 68 65 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  the full table s
11b10 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  can */.    retur
11b20 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61  n;.  }..  /* Sea
11b30 72 63 68 20 66 6f 72 20 61 6e 79 20 65 71 75 61  rch for any equa
11b40 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
11b50 74 65 72 6d 20 2a 2f 0a 20 20 70 57 43 45 6e 64  term */.  pWCEnd
11b60 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
11b70 6e 54 65 72 6d 5d 3b 0a 20 20 66 6f 72 28 70 54  nTerm];.  for(pT
11b80 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
11b90 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
11ba0 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
11bb0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
11bc0 65 72 6d 2c 20 70 53 72 63 2c 20 70 2d 3e 6e 6f  erm, pSrc, p->no
11bd0 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
11be0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 61 75   WHERETRACE(("au
11bf0 74 6f 2d 69 6e 64 65 78 20 72 65 64 75 63 65 73  to-index reduces
11c00 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e 31 66 20   cost from %.1f 
11c10 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20 20 20 20  to %.1f\n",.    
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 2c 20 63  p->cost.rCost, c
11c40 6f 73 74 54 65 6d 70 49 64 78 29 29 3b 0a 20 20  ostTempIdx));.  
11c50 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73      p->cost.rCos
11c60 74 20 3d 20 63 6f 73 74 54 65 6d 70 49 64 78 3b  t = costTempIdx;
11c70 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70  .      p->cost.p
11c80 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20  lan.nRow = logN 
11c90 2b 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f  + 1;.      p->co
11ca0 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
11cb0 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  = WHERE_TEMP_IND
11cc0 45 58 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73  EX;.      p->cos
11cd0 74 2e 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e  t.used = pTerm->
11ce0 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
11cf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11d00 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
11d10 66 69 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74  fine bestAutomat
11d20 69 63 49 6e 64 65 78 28 41 29 20 20 2f 2a 20 6e  icIndex(A)  /* n
11d30 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  o-op */.#endif /
11d40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
11d50 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
11d60 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
11d70 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
11d80 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
11d90 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
11da0 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
11db0 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
11dc0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
11dd0 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
11de0 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
11df0 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
11e00 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
11e10 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
11e20 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
11e30 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
11e40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
11e50 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
11e60 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
11e70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
11e80 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
11e90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11ea0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
11eb0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
11ec0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
11ed0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
11ee0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
11ef0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
11f00 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
11f10 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
11f20 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
11f30 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
11f40 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
11f50 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
11f60 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
11f70 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
11f80 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
11f90 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
11fa0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
11fb0 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
11fc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11fd0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
11fe0 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
11ff0 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
12000 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
12010 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
12020 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
12030 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12040 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
12050 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
12060 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
12070 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72  /* Byte of memor
120a0 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64  y needed for pId
120b0 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
120c0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
120d0 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
120e0 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
120f0 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
12100 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12120 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
12130 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
12140 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
12150 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
12160 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12170 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
12180 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
12190 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
121a0 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
121b0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
121c0 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
121d0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
121e0 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyinfo;         
121f0 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
12200 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ion for the inde
12210 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64  x */   .  int ad
12220 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
12230 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
12240 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
12250 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
12260 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
12270 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
12280 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
12290 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
122a0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
122b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
122c0 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
122d0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
12300 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12320 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
12330 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
12340 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
12350 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
12360 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
12370 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
12380 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d  column */.  Bitm
12390 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20  ask idxCols;    
123a0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
123b0 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65  p of columns use
123c0 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  d for indexing *
123d0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
123e0 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  aCols;          
123f0 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64  /* Bitmap of add
12400 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
12410 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  */..  /* Generat
12420 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f  e code to skip o
12430 76 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ver the creation
12440 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74   and initializat
12450 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
12460 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
12470 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  on 2nd and subse
12480 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73  quent iterations
12490 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f   of the loop. */
124a0 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
124b0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
124c0 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e  v!=0 );.  addrIn
124d0 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  it = sqlite3Code
124e0 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 0a 20  Once(pParse);.. 
124f0 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
12500 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
12510 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64  that will be add
12520 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a  ed to the index.
12530 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f    ** and used to
12540 20 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61   match WHERE cla
12550 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
12560 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30  */.  nColumn = 0
12570 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72  ;.  pTable = pSr
12580 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e  c->pTab;.  pWCEn
12590 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
125a0 3e 6e 54 65 72 6d 5d 3b 0a 20 20 69 64 78 43 6f  >nTerm];.  idxCo
125b0 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
125c0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
125d0 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
125e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
125f0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
12600 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
12610 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
12620 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
12630 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
12640 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
12650 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
12660 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42  ((Bitmask)1)<<(B
12670 4d 53 2d 31 29 20 3a 20 28 28 42 69 74 6d 61 73  MS-1) : ((Bitmas
12680 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20  k)1)<<iCol;.    
12690 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
126a0 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
126b0 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
126c0 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
126d0 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
126e0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
126f0 20 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20    nColumn++;.   
12700 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
12710 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  cMask;.      }. 
12720 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
12730 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a  t( nColumn>0 );.
12740 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e    pLevel->plan.n
12750 45 71 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20  Eq = nColumn;.. 
12760 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
12770 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
12780 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
12790 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
127a0 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
127b0 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
127c0 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
127d0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
127e0 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
127f0 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
12800 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
12810 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
12820 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
12830 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
12840 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
12850 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
12860 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
12870 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
12880 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
12890 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
128a0 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
128b0 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
128c0 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
128d0 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
128e0 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
128f0 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
12900 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
12910 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
12920 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
12930 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
12940 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 28 28  & (~idxCols | ((
12950 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
12960 53 2d 31 29 29 29 3b 0a 20 20 6d 78 42 69 74 43  S-1)));.  mxBitC
12970 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43  ol = (pTable->nC
12980 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42  ol >= BMS-1) ? B
12990 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e  MS-1 : pTable->n
129a0 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28  Col;.  testcase(
129b0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
129c0 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
129d0 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
129e0 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
129f0 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
12a00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12a10 65 78 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42  extraCols & (((B
12a20 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 20  itmask)1)<<i) ) 
12a30 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20  nColumn++;.  }. 
12a40 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
12a50 65 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ed & (((Bitmask)
12a60 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a  1)<<(BMS-1)) ){.
12a70 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70      nColumn += p
12a80 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
12a90 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 65  S + 1;.  }.  pLe
12aa0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
12ab0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
12ac0 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58  N_EQ | WHERE_IDX
12ad0 5f 4f 4e 4c 59 20 7c 20 57 4f 5f 45 51 3b 0a 0a  _ONLY | WO_EQ;..
12ae0 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
12af0 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
12b00 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73  to describe this
12b10 20 69 6e 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74   index */.  nByt
12b20 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78  e = sizeof(Index
12b30 29 3b 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43  );.  nByte += nC
12b40 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74  olumn*sizeof(int
12b50 29 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e  );     /* Index.
12b60 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42  aiColumn */.  nB
12b70 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73  yte += nColumn*s
12b80 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 20 20 20  izeof(char*);   
12b90 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
12ba0 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43  */.  nByte += nC
12bb0 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
12bc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
12bd0 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
12be0 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 44 62  pIdx = sqlite3Db
12bf0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
12c00 65 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  e->db, nByte);. 
12c10 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
12c20 65 74 75 72 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d  eturn;.  pLevel-
12c30 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70  >plan.u.pIdx = p
12c40 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43  Idx;.  pIdx->azC
12c50 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70  oll = (char**)&p
12c60 49 64 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e  Idx[1];.  pIdx->
12c70 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a  aiColumn = (int*
12c80 29 26 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e  )&pIdx->azColl[n
12c90 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d  Column];.  pIdx-
12ca0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
12cb0 38 2a 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75  8*)&pIdx->aiColu
12cc0 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70  mn[nColumn];.  p
12cd0 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75  Idx->zName = "au
12ce0 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64  to-index";.  pId
12cf0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f  x->nColumn = nCo
12d00 6c 75 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54  lumn;.  pIdx->pT
12d10 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  able = pTable;. 
12d20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c   n = 0;.  idxCol
12d30 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
12d40 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
12d50 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
12d60 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43  ){.    if( termC
12d70 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
12d80 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
12d90 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
12da0 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
12db0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
12dc0 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
12dd0 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28   = iCol>=BMS ? (
12de0 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
12df0 53 2d 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b  S-1) : ((Bitmask
12e00 29 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20  )1)<<iCol;.     
12e10 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
12e20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
12e30 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
12e40 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
12e50 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
12e60 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20   cMask;.        
12e70 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
12e80 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ] = pTerm->u.lef
12e90 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
12ea0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
12eb0 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
12ec0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
12ed0 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
12ee0 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ht);.        pId
12ef0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41  x->azColl[n] = A
12f00 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70  LWAYS(pColl) ? p
12f10 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42  Coll->zName : "B
12f20 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20  INARY";.        
12f30 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
12f40 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
12f50 20 28 75 33 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d   (u32)n==pLevel-
12f60 3e 70 6c 61 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20  >plan.nEq );..  
12f70 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61  /* Add additiona
12f80 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
12f90 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74   to make the aut
12fa0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74  omatic index int
12fb0 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e  o.  ** a coverin
12fc0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72  g index */.  for
12fd0 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
12fe0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12ff0 65 78 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42  extraCols & (((B
13000 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b  itmask)1)<<i) ){
13010 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
13020 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
13030 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
13040 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
13050 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
13060 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
13070 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69  >colUsed & (((Bi
13080 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
13090 29 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  )) ){.    for(i=
130a0 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d  BMS-1; i<pTable-
130b0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
130c0 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
130d0 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
130e0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
130f0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
13100 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
13110 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43  .  assert( n==nC
13120 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43  olumn );..  /* C
13130 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
13140 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  tic index */.  p
13150 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65  Keyinfo = sqlite
13160 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
13170 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61  arse, pIdx);.  a
13180 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
13190 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73  IdxCur>=0 );.  s
131a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
131b0 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
131c0 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
131d0 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31  dxCur, nColumn+1
131e0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
131f0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13200 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyinfo, P4_KEY
13210 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
13220 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13230 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c   "for %s", pTabl
13240 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f  e->zName));..  /
13250 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d  * Fill the autom
13260 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68 20  atic index with 
13270 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64  content */.  add
13280 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
13290 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
132a0 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  ewind, pLevel->i
132b0 54 61 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65  TabCur);.  regRe
132c0 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
132d0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
132e0 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
132f0 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
13300 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c  se, pIdx, pLevel
13310 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65  ->iTabCur, regRe
13320 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69  cord, 1);.  sqli
13330 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13340 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
13350 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
13360 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
13370 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
13380 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
13390 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
133a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
133b0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76  v, OP_Next, pLev
133c0 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64  el->iTabCur, add
133d0 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74  rTop+1);.  sqlit
133e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
133f0 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
13400 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a  TUS_AUTOINDEX);.
13410 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13420 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
13430 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
13440 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
13450 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
13460 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65   .  /* Jump here
13470 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74   when skipping t
13480 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
13490 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
134a0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
134b0 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69  drInit);.}.#endi
134c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
134d0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
134e0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
134f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13500 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
13510 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
13520 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
13530 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
13540 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
13550 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
13560 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
13570 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
13580 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
13590 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
135a0 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
135b0 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
135c0 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
135d0 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
135e0 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
135f0 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
13600 6e 64 65 78 49 6e 66 6f 28 57 68 65 72 65 42 65  ndexInfo(WhereBe
13610 73 74 49 64 78 20 2a 70 29 7b 0a 20 20 50 61 72  stIdx *p){.  Par
13620 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
13630 70 50 61 72 73 65 3b 20 0a 20 20 57 68 65 72 65  pParse; .  Where
13640 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d  Clause *pWC = p-
13650 3e 70 57 43 3b 0a 20 20 73 74 72 75 63 74 20 53  >pWC;.  struct S
13660 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
13670 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 45  c = p->pSrc;.  E
13680 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
13690 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
136a0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
136b0 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75  nt nTerm;.  stru
136c0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
136d0 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
136e0 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
136f0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
13700 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
13710 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
13720 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
13730 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
13740 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
13750 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   *pTerm;.  int n
13760 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74  OrderBy;.  sqlit
13770 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
13780 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52  IdxInfo;..  WHER
13790 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75  ETRACE(("Recompu
137a0 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20  ting index info 
137b0 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53  for %s...\n", pS
137c0 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  rc->pTab->zName)
137d0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
137e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
137f0 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
13800 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
13810 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
13820 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
13830 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
13840 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
13850 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
13860 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
13870 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
13880 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
13890 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
138a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
138b0 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
138c0 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
138d0 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
138e0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
138f0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13900 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
13910 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
13920 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
13930 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
13940 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
13950 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
13960 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
13970 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
13980 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
13990 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
139a0 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
139b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
139c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
139d0 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
139e0 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
139f0 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
13a00 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
13a10 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
13a20 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
13a30 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
13a40 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13a50 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
13a60 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
13a70 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
13a80 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72  .    int n = pOr
13a90 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
13aa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
13ab0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
13ac0 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
13ad0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
13ae0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
13af0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
13b00 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
13b10 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
13b20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13b30 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20    if( i==n){.   
13b40 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b     nOrderBy = n;
13b50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13b60 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
13b70 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13b80 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
13b90 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
13ba0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
13bb0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
13bc0 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
13bf0 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
13c00 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
13c10 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
13c40 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
13c50 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
13c60 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
13c70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13c80 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
13c90 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20  emory");.    /* 
13ca0 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73  (double)0 In cas
13cb0 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
13cc0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
13cd0 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  .. */.    return
13ce0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   0;.  }..  /* In
13cf0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
13d00 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
13d10 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13d20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
13d30 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65  ns.  ** many fie
13d40 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63  lds that are dec
13d50 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f  lared "const" to
13d60 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e   prevent xBestIn
13d70 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68  dex from.  ** ch
13d80 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65  anging them.  We
13d90 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
13da0 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69   funky casting i
13db0 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
13dc0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65  initialize those
13dd0 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20   fields..  */.  
13de0 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75  pIdxCons = (stru
13df0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13e00 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49  _constraint*)&pI
13e10 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64  dxInfo[1];.  pId
13e20 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75  xOrderBy = (stru
13e30 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13e40 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43  _orderby*)&pIdxC
13e50 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55  ons[nTerm];.  pU
13e60 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73  sage = (struct s
13e70 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13e80 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26  straint_usage*)&
13e90 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64  pIdxOrderBy[nOrd
13ea0 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29  erBy];.  *(int*)
13eb0 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
13ec0 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
13ed0 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
13ee0 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
13ef0 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
13f00 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
13f10 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
13f20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13f30 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73  raint = pIdxCons
13f40 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
13f50 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
13f60 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  by**)&pIdxInfo->
13f70 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f  aOrderBy = pIdxO
13f80 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
13f90 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13fa0 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
13fb0 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  e**)&pIdxInfo->a
13fc0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20  ConstraintUsage 
13fd0 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20       pUsage;..  
14020 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
14030 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
14040 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
14050 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b  m++){.    u8 op;
14060 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
14070 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
14080 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
14090 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
140a0 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
140b0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
140c0 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
140d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
140e0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
140f0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
14100 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14110 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
14120 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66  ISNULL );.    if
14130 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
14140 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29  or & (WO_ISNULL)
14150 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14160 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
14170 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
14180 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14190 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
141a0 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
141b0 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
141c0 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
141d0 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
141e0 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
141f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
14200 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
14210 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
14220 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  _EQ;.    pIdxCon
14230 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  s[j].op = op;.  
14240 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
14250 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
14260 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
14270 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
14280 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
14290 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
142a0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
142b0 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
142c0 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
142d0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
142e0 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
142f0 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
14300 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d   assert( WO_EQ==
14310 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
14320 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20  STRAINT_EQ );.  
14330 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d    assert( WO_LT=
14340 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
14350 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20  NSTRAINT_LT );. 
14360 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
14370 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14380 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
14390 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
143a0 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
143b0 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
143c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
143d0 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
143e0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
143f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
14400 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
14410 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
14420 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73  MATCH );.    ass
14430 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
14440 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
14450 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
14460 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
14470 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
14480 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
14490 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
144a0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
144b0 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
144c0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
144d0 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
144e0 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
144f0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
14500 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
14510 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
14520 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
14530 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
14540 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
14550 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
14560 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
14570 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
14580 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
14590 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
145a0 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
145b0 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
145c0 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
145d0 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
145e0 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
145f0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
14600 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
14610 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69  3_index_info poi
14620 6e 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61  nter passed.** a
14630 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  s the argument..
14640 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
14650 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
14660 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
14670 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
14680 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
14690 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
146a0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
146b0 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
146c0 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
146d0 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
146e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
146f0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
14700 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
14710 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
14720 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
14730 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
14740 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
14750 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
14760 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14770 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
14780 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
14790 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
147a0 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
147b0 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
147c0 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
147d0 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
147e0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
147f0 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
14800 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
14810 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
14820 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
14830 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
14840 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
14850 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
14860 63 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45  c;..  WHERETRACE
14870 28 28 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f  (("xBestIndex fo
14880 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a  r %s\n", pTab->z
14890 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f  Name));.  TRACE_
148a0 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20  IDX_INPUTS(p);. 
148b0 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
148c0 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78  dule->xBestIndex
148d0 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52  (pVtab, p);.  TR
148e0 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
148f0 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  p);..  if( rc!=S
14900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
14920 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50  OMEM ){.      pP
14930 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
14940 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
14950 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62  }else if( !pVtab
14960 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
14970 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14980 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
14990 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
149a0 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
149b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
149c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
149d0 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  s", pVtab->zErrM
149e0 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sg);.    }.  }. 
149f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
14a00 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
14a10 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
14a20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
14a30 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
14a40 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
14a50 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74   !p->aConstraint
14a60 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d  [i].usable && p-
14a70 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
14a80 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
14a90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14aa0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14ab0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61  , .          "ta
14ac0 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64  ble %s: xBestInd
14ad0 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69  ex returned an i
14ae0 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54  nvalid plan", pT
14af0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14b00 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
14b10 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a  pParse->nErr;.}.
14b20 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
14b30 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66  the best index f
14b40 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  or a virtual tab
14b50 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65  le..**.** The be
14b60 73 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70  st index is comp
14b70 75 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73  uted by the xBes
14b80 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66  tIndex method of
14b90 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20   the virtual.** 
14ba0 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54  table module.  T
14bb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
14bc0 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61  eally just a wra
14bd0 70 70 65 72 20 74 68 61 74 20 73 65 74 73 20 75  pper that sets u
14be0 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  p.** the sqlite3
14bf0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
14c00 63 74 75 72 65 20 74 68 61 74 20 69 73 20 75 73  cture that is us
14c10 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74  ed to communicat
14c20 65 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49  e with.** xBestI
14c30 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  ndex..**.** In a
14c40 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74   join, this rout
14c50 69 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c  ine might be cal
14c60 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  led multiple tim
14c70 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61  es for the.** sa
14c80 6d 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  me virtual table
14c90 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
14ca0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14cb0 75 72 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ure is created.*
14cc0 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
14cd0 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  d on the first i
14ce0 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65  nvocation and re
14cf0 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73  used on all subs
14d00 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61  equent.** invoca
14d10 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69  tions.  The sqli
14d20 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
14d30 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f  tructure is also
14d40 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f   used when.** co
14d50 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
14d60 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 69  to access the vi
14d70 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
14d80 65 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74  e whereInfoDelet
14d90 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  e() .** routine 
14da0 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72  takes care of fr
14db0 65 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  eeing the sqlite
14dc0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
14dd0 75 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20  ucture after.** 
14de0 65 76 65 72 79 62 6f 64 79 20 68 61 73 20 66 69  everybody has fi
14df0 6e 69 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a  nished with it..
14e00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
14e10 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
14e20 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29  WhereBestIdx *p)
14e30 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
14e40 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 20  e = p->pParse;  
14e50 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
14e60 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14e70 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
14e80 20 3d 20 70 2d 3e 70 57 43 3b 20 20 20 20 20 20   = p->pWC;      
14e90 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
14ea0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
14eb0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
14ec0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a  rc = p->pSrc; /*
14ed0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
14ee0 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
14ef0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
14f00 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
14f10 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14f20 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
14f30 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
14f40 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
14f50 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
14f60 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14f70 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
14f80 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
14f90 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
14fa0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
14fb0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
14fc0 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 3b    int sortOrder;
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    /* Sort order 
14ff0 66 6f 72 20 49 4e 20 63 6c 61 75 73 65 73 20 2a  for IN clauses *
15000 2f 0a 20 20 69 6e 74 20 62 41 6c 6c 6f 77 49 4e  /.  int bAllowIN
15010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15020 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20 49 4e 20      /* Allow IN 
15030 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 2a 2f  optimizations */
15040 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b  .  double rCost;
15050 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
15060 20 77 73 46 6c 61 67 73 20 69 73 20 69 6e 69 74   wsFlags is init
15070 69 61 6c 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20  ialized to some 
15080 73 61 6e 65 20 76 61 6c 75 65 2e 20 4f 74 68 65  sane value. Othe
15090 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 0a 20  rwise, if the . 
150a0 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c   ** malloc in al
150b0 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
150c0 29 20 66 61 69 6c 73 20 61 6e 64 20 74 68 69 73  ) fails and this
150d0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
150e0 73 20 6c 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77  s leaving.  ** w
150f0 73 46 6c 61 67 73 20 69 6e 20 61 6e 20 75 6e 69  sFlags in an uni
15100 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65  nitialized state
15110 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
15120 20 62 65 68 61 76 65 20 75 6e 70 72 65 64 69 63   behave unpredic
15130 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65  tably..  */.  me
15140 6d 73 65 74 28 26 70 2d 3e 63 6f 73 74 2c 20 30  mset(&p->cost, 0
15150 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 73 74  , sizeof(p->cost
15160 29 29 3b 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c  ));.  p->cost.pl
15170 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  an.wsFlags = WHE
15180 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
15190 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71  ..  /* If the sq
151a0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
151b0 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 6e   structure has n
151c0 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ot been previous
151d0 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
151e0 64 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  d and initialize
151f0 64 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  d, then allocate
15200 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
15210 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  it now..  */.  p
15220 49 64 78 49 6e 66 6f 20 3d 20 2a 70 2d 3e 70 70  IdxInfo = *p->pp
15230 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  IdxInfo;.  if( p
15240 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
15250 20 20 2a 70 2d 3e 70 70 49 64 78 49 6e 66 6f 20    *p->ppIdxInfo 
15260 3d 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c  = pIdxInfo = all
15270 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70  ocateIndexInfo(p
15280 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  );.  }.  if( pId
15290 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
152a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
152b0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
152c0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
152d0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
152e0 65 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20  e that pIdxInfo 
152f0 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77  points.  ** to w
15300 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e  ill have been in
15310 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65  itialized, eithe
15320 72 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  r during the cur
15330 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rent invocation 
15340 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73  or.  ** during s
15350 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61  ome prior invoca
15360 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75  tion.  Now we ju
15370 73 74 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f  st have to custo
15380 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65  mize the.  ** de
15390 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66  tails of pIdxInf
153a0 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  o for the curren
153b0 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
153c0 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a   pass it to.  **
153d0 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a   xBestIndex..  *
153e0 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75  /..  /* The modu
153f0 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
15400 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62  defined. Also, b
15410 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  y this point the
15420 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  re must.  ** be 
15430 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
15440 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
15450 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73  ucture. Otherwis
15460 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69  e.  ** sqlite3Vi
15470 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
15480 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69  () would have pi
15490 63 6b 65 64 20 75 70 20 74 68 65 20 65 72 72 6f  cked up the erro
154a0 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  r. .  */.  asser
154b0 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  t( pTab->azModul
154c0 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a  eArg && pTab->az
154d0 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a  ModuleArg[0] );.
154e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
154f0 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
15500 65 2d 3e 64 62 2c 20 70 54 61 62 29 20 29 3b 0a  e->db, pTab) );.
15510 0a 20 20 2f 2a 20 54 72 79 20 6f 6e 63 65 20 6f  .  /* Try once o
15520 72 20 74 77 69 63 65 2e 20 20 4f 6e 20 74 68 65  r twice.  On the
15530 20 66 69 72 73 74 20 61 74 74 65 6d 70 74 2c 20   first attempt, 
15540 61 6c 6c 6f 77 20 49 4e 20 6f 70 74 69 6d 69 7a  allow IN optimiz
15550 61 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 49 66 20  ations..  ** If 
15560 61 6e 20 49 4e 20 6f 70 74 69 6d 69 7a 61 74 69  an IN optimizati
15570 6f 6e 20 69 73 20 61 63 63 65 70 74 65 64 20 62  on is accepted b
15580 79 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  y the virtual ta
15590 62 6c 65 20 78 42 65 73 74 49 6e 64 65 78 0a 20  ble xBestIndex. 
155a0 20 2a 2a 20 6d 65 74 68 6f 64 2c 20 62 75 74 20   ** method, but 
155b0 74 68 65 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e  the  pInfo->aCon
155c0 73 74 72 61 69 6e 55 73 61 67 65 2e 6f 6d 69 74  strainUsage.omit
155d0 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
155e0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
155f0 71 75 65 72 79 20 77 69 6c 6c 20 6e 6f 74 20 77  query will not w
15600 6f 72 6b 20 62 65 63 61 75 73 65 20 69 74 20 6d  ork because it m
15610 69 67 68 74 20 61 6c 6c 6f 77 20 64 75 70 6c 69  ight allow dupli
15620 63 61 74 65 20 72 6f 77 73 20 69 6e 0a 20 20 2a  cate rows in.  *
15630 2a 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 74 68  * output.  In th
15640 61 74 20 63 61 73 65 2c 20 72 75 6e 20 74 68 65  at case, run the
15650 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
15660 6f 64 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  od a second time
15670 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .  ** without th
15680 65 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  e IN constraints
15690 2e 20 20 55 73 75 61 6c 6c 79 20 74 68 69 73 20  .  Usually this 
156a0 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
156b0 6e 63 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 6f  nce..  ** The lo
156c0 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 75 73 69  op will exit usi
156d0 6e 67 20 61 20 22 62 72 65 61 6b 22 20 73 74 61  ng a "break" sta
156e0 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  tement..  */.  f
156f0 6f 72 28 62 41 6c 6c 6f 77 49 4e 3d 31 3b 20 31  or(bAllowIN=1; 1
15700 3b 20 62 41 6c 6c 6f 77 49 4e 2d 2d 29 7b 0a 20  ; bAllowIN--){. 
15710 20 20 20 61 73 73 65 72 74 28 20 62 41 6c 6c 6f     assert( bAllo
15720 77 49 4e 3d 3d 30 20 7c 7c 20 62 41 6c 6c 6f 77  wIN==0 || bAllow
15730 49 4e 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  IN==1 );..    /*
15740 20 53 65 74 20 74 68 65 20 61 43 6f 6e 73 74 72   Set the aConstr
15750 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69  aint[].usable fi
15760 65 6c 64 73 20 61 6e 64 20 69 6e 69 74 69 61 6c  elds and initial
15770 69 7a 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  ize all .    ** 
15780 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
15790 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a   to zero..    **
157a0 0a 20 20 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61  .    ** aConstra
157b0 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20  int[].usable is 
157c0 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61  true for constra
157d0 69 6e 74 73 20 77 68 65 72 65 20 74 68 65 20 72  ints where the r
157e0 69 67 68 74 2d 68 61 6e 64 0a 20 20 20 20 2a 2a  ight-hand.    **
157f0 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f   side contains o
15800 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  nly references t
15810 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  o tables to the 
15820 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75 72 72  left of the curr
15830 65 6e 74 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ent.    ** table
15840 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
15850 73 2c 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72  s, if the constr
15860 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  aint is of the f
15870 6f 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  orm:.    **.    
15880 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  **           col
15890 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20 20 20 2a  umn = expr.    *
158a0 2a 0a 20 20 20 20 2a 2a 20 61 6e 64 20 77 65 20  *.    ** and we 
158b0 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 61  are evaluating a
158c0 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
158d0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f  constraint on co
158e0 6c 75 6d 6e 20 69 73 20 0a 20 20 20 20 2a 2a 20  lumn is .    ** 
158f0 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c  only valid if al
15900 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  l tables referen
15910 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75  ced in expr occu
15920 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  r to the left.  
15930 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
15940 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c  e containing col
15950 75 6d 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  umn..    **.    
15960 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69  ** The aConstrai
15970 6e 74 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  nts[] array cont
15980 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
15990 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
159a0 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63  .    ** on the c
159b0 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 20 54  urrent table.  T
159c0 68 61 74 20 77 61 79 20 77 65 20 6f 6e 6c 79 20  hat way we only 
159d0 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65 20  have to compute 
159e0 69 74 20 6f 6e 63 65 0a 20 20 20 20 2a 2a 20 65  it once.    ** e
159f0 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20 6d 69  ven though we mi
15a00 67 68 74 20 74 72 79 20 74 6f 20 70 69 63 6b 20  ght try to pick 
15a10 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 6d  the best index m
15a20 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20  ultiple times.. 
15a30 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 61     ** For each a
15a40 74 74 65 6d 70 74 20 61 74 20 70 69 63 6b 69 6e  ttempt at pickin
15a50 67 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  g an index, the 
15a60 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20  order of tables 
15a70 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  in the.    ** jo
15a80 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66 66  in might be diff
15a90 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76 65  erent so we have
15aa0 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
15ab0 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20 20  e usable flag.  
15ac0 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a    ** each time..
15ad0 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 43      */.    pIdxC
15ae0 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
15af0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
15b00 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
15b10 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
15b20 3b 0a 20 20 20 20 70 55 73 61 67 65 20 3d 20 70  ;.    pUsage = p
15b30 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
15b40 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 66  aintUsage;.    f
15b50 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
15b60 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
15b70 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
15b80 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64  ){.      j = pId
15b90 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
15ba0 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  et;.      pTerm 
15bb0 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
15bc0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
15bd0 70 72 65 72 65 71 52 69 67 68 74 26 70 2d 3e 6e  prereqRight&p->n
15be0 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20  otReady)==0.    
15bf0 20 20 20 26 26 20 28 62 41 6c 6c 6f 77 49 4e 20     && (bAllowIN 
15c00 7c 7c 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  || (pTerm->eOper
15c10 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  ator & WO_IN)==0
15c20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
15c30 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
15c40 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ble = 1;.      }
15c50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
15c60 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
15c70 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
15c80 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73  }.    memset(pUs
15c90 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
15ca0 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
15cb0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
15cc0 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
15cd0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
15ce0 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73 71  xStr ){.      sq
15cf0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
15d00 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
15d10 20 20 7d 0a 20 20 20 20 70 49 64 78 49 6e 66 6f    }.    pIdxInfo
15d20 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
15d30 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
15d40 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  um = 0;.    pIdx
15d50 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
15d60 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
15d70 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
15d80 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
15d90 20 20 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32     /* ((double)2
15da0 29 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c  ) In case of SQL
15db0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
15dc0 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20  G_POINT... */.  
15dd0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
15de0 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49  matedCost = SQLI
15df0 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28 64  TE_BIG_DBL / ((d
15e00 6f 75 62 6c 65 29 32 29 3b 0a 20 20 20 20 6e 4f  ouble)2);.    nO
15e10 72 64 65 72 42 79 20 3d 20 70 49 64 78 49 6e 66  rderBy = pIdxInf
15e20 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20  o->nOrderBy;.   
15e30 20 69 66 28 20 21 70 2d 3e 70 4f 72 64 65 72 42   if( !p->pOrderB
15e40 79 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49  y ){.      pIdxI
15e50 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
15e60 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
15e70 69 66 28 20 76 74 61 62 42 65 73 74 49 6e 64 65  if( vtabBestInde
15e80 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  x(pParse, pTab, 
15e90 70 49 64 78 49 6e 66 6f 29 20 29 7b 0a 20 20 20  pIdxInfo) ){.   
15ea0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
15eb0 0a 20 20 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  .  .    sortOrde
15ec0 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53  r = SQLITE_SO_AS
15ed0 43 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  C;.    pIdxCons 
15ee0 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
15ef0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
15f00 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
15f10 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
15f20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
15f30 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
15f40 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
15f50 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  s++){.      if( 
15f60 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
15f70 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  dex>0 ){.       
15f80 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
15f90 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
15fa0 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
15fb0 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[j];.        
15fc0 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 7c 3d 20  p->cost.used |= 
15fd0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
15fe0 68 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ht;.        if( 
15ff0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
16000 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
16010 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
16020 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30  Usage[i].omit==0
16030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16040 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  /* Do not attemp
16050 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63  t to use an IN c
16060 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65  onstraint if the
16070 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
16080 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
16090 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69  ys that the equi
160a0 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72  valent EQ constr
160b0 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  aint cannot be s
160c0 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20  afely omitted.. 
160d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66             ** If
160e0 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74   we do attempt t
160f0 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e  o use such a con
16100 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f  straint, some ro
16110 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ws might be.    
16120 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61          ** repea
16130 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ted in the outpu
16140 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
16150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
16160 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
16170 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 49 6e  or(k=0; k<pIdxIn
16180 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 6b 2b  fo->nOrderBy; k+
16190 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
161a0 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  if( pIdxInfo->aO
161b0 72 64 65 72 42 79 5b 6b 5d 2e 69 43 6f 6c 75 6d  rderBy[k].iColum
161c0 6e 3d 3d 70 49 64 78 43 6f 6e 73 2d 3e 69 43 6f  n==pIdxCons->iCo
161d0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
161e0 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
161f0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  = pIdxInfo->aOrd
16200 65 72 42 79 5b 6b 5d 2e 64 65 73 63 3b 0a 20 20  erBy[k].desc;.  
16210 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
16220 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
16230 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16250 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
16260 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
16270 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20  raint ) break;. 
16280 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68   }.  .  /* If th
16290 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
162a0 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74  BY clause, and t
162b0 68 65 20 73 65 6c 65 63 74 65 64 20 76 69 72 74  he selected virt
162c0 75 61 6c 20 74 61 62 6c 65 20 69 6e 64 65 78 0a  ual table index.
162d0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 61    ** does not sa
162e0 74 69 73 66 79 20 69 74 2c 20 69 6e 63 72 65 61  tisfy it, increa
162f0 73 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  se the cost of t
16300 68 65 20 73 63 61 6e 20 61 63 63 6f 72 64 69 6e  he scan accordin
16310 67 6c 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d  gly. This.  ** m
16320 61 74 63 68 65 73 20 74 68 65 20 70 72 6f 63 65  atches the proce
16330 73 73 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76 69  ssing for non-vi
16340 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20  rtual tables in 
16350 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29  bestBtreeIndex()
16360 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20 3d  ..  */.  rCost =
16370 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
16380 61 74 65 64 43 6f 73 74 3b 0a 20 20 69 66 28 20  atedCost;.  if( 
16390 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
163a0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
163b0 43 6f 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20  Consumed==0 ){. 
163c0 20 20 20 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c     rCost += estL
163d0 6f 67 28 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b  og(rCost)*rCost;
163e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
163f0 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ost is not allow
16400 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20  ed to be larger 
16410 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f  than SQLITE_BIG_
16420 44 42 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e  DBL (the.  ** in
16430 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f  ital value of lo
16440 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73  westCost in this
16450 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c   loop. If it is,
16460 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28   then the.  ** (
16470 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29  cost<lowestCost)
16480 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c   test below will
16490 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a   never be true..
164a0 20 20 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22    ** .  ** Use "
164b0 28 64 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65  (double)2" inste
164c0 61 64 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63  ad of "2.0" in c
164d0 61 73 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ase OMIT_FLOATIN
164e0 47 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73  G_POINT .  ** is
164f0 20 64 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20   defined..  */. 
16500 20 69 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47   if( (SQLITE_BIG
16510 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29  _DBL/((double)2)
16520 29 3c 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 70  )<rCost ){.    p
16530 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 28  ->cost.rCost = (
16540 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28  SQLITE_BIG_DBL/(
16550 28 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d  (double)2));.  }
16560 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f 73  else{.    p->cos
16570 74 2e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  t.rCost = rCost;
16580 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 73 74 2e 70  .  }.  p->cost.p
16590 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d  lan.u.pVtabIdx =
165a0 20 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28   pIdxInfo;.  if(
165b0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
165c0 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20  ByConsumed ){.  
165d0 20 20 61 73 73 65 72 74 28 20 73 6f 72 74 4f 72    assert( sortOr
165e0 64 65 72 3d 3d 30 20 7c 7c 20 73 6f 72 74 4f 72  der==0 || sortOr
165f0 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 70 2d  der==1 );.    p-
16600 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
16610 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45  gs |= WHERE_ORDE
16620 52 45 44 20 2b 20 73 6f 72 74 4f 72 64 65 72 2a  RED + sortOrder*
16630 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20  WHERE_REVERSE;. 
16640 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e     p->cost.plan.
16650 6e 4f 42 53 61 74 20 3d 20 6e 4f 72 64 65 72 42  nOBSat = nOrderB
16660 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
16670 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42  p->cost.plan.nOB
16680 53 61 74 20 3d 20 70 2d 3e 69 20 3f 20 70 2d 3e  Sat = p->i ? p->
16690 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70  aLevel[p->i-1].p
166a0 6c 61 6e 2e 6e 4f 42 53 61 74 20 3a 20 30 3b 0a  lan.nOBSat : 0;.
166b0 20 20 7d 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c    }.  p->cost.pl
166c0 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70 49  an.nEq = 0;.  pI
166d0 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
166e0 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = nOrderBy;..  
166f0 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
16700 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20   more efficient 
16710 61 63 63 65 73 73 20 70 61 74 74 65 72 6e 20 62  access pattern b
16720 79 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65  y using multiple
16730 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74 6f   indexes.  ** to
16740 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52 20   optimize an OR 
16750 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69  expression withi
16760 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
16770 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73 74  se. .  */.  best
16780 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70 29  OrClauseIndex(p)
16790 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
167a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
167b0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65  LTABLE */..#ifde
167c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
167d0 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT3./*.** Esti
167e0 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  mate the locatio
167f0 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61  n of a particula
16800 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20  r key among all 
16810 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  keys in an.** in
16820 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20  dex.  Store the 
16830 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74  results in aStat
16840 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
16850 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20  **    aStat[0]  
16860 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
16870 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61  of rows less tha
16880 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74  n pVal.**    aSt
16890 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20  at[1]      Est. 
168a0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
168b0 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a  qual to pVal.**.
168c0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
168d0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
168e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
168f0 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50  ereKeyStats(.  P
16900 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
16920 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16930 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
16940 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
16950 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
16960 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f  onsider domain o
16970 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  f */.  sqlite3_v
16980 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20 20 20  alue *pVal,     
16990 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 63     /* Value to c
169a0 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74  onsider */.  int
169b0 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20   roundUp,       
169c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e           /* Roun
169d0 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20 52  d up if true.  R
169e0 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c  ound down if fal
169f0 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  se */.  tRowcnt 
16a00 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20 20  *aStat          
16a10 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74      /* OUT: stat
16a20 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  s written here *
16a30 2f 0a 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e  /.){.  tRowcnt n
16a40 3b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  ;.  IndexSample 
16a50 2a 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  *aSample;.  int 
16a60 69 2c 20 65 54 79 70 65 3b 0a 20 20 69 6e 74 20  i, eType;.  int 
16a70 69 73 45 71 20 3d 20 30 3b 0a 20 20 69 36 34 20  isEq = 0;.  i64 
16a80 76 3b 0a 20 20 64 6f 75 62 6c 65 20 72 2c 20 72  v;.  double r, r
16a90 53 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 72 6f  S;..  assert( ro
16aa0 75 6e 64 55 70 3d 3d 30 20 7c 7c 20 72 6f 75 6e  undUp==0 || roun
16ab0 64 55 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  dUp==1 );.  asse
16ac0 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
16ad0 65 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 56 61  e>0 );.  if( pVa
16ae0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
16af0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 6e 20  LITE_ERROR;.  n 
16b00 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74  = pIdx->aiRowEst
16b10 5b 30 5d 3b 0a 20 20 61 53 61 6d 70 6c 65 20 3d  [0];.  aSample =
16b20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
16b30 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
16b40 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61  3_value_type(pVa
16b50 6c 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  l);..  if( eType
16b60 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
16b70 20 29 7b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69   ){.    v = sqli
16b80 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
16b90 70 56 61 6c 29 3b 0a 20 20 20 20 72 20 3d 20 28  pVal);.    r = (
16ba0 69 36 34 29 76 3b 0a 20 20 20 20 66 6f 72 28 69  i64)v;.    for(i
16bb0 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  =0; i<pIdx->nSam
16bc0 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
16bd0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16be0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
16bf0 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
16c00 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
16c10 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54  [i].eType>=SQLIT
16c20 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b 0a  E_TEXT ) break;.
16c30 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
16c40 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
16c50 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TE_INTEGER ){.  
16c60 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
16c70 65 5b 69 5d 2e 75 2e 69 3e 3d 76 20 29 7b 0a 20  e[i].u.i>=v ){. 
16c80 20 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20           isEq = 
16c90 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3d 3d  aSample[i].u.i==
16ca0 76 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  v;.          bre
16cb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
16cc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16cd0 20 20 20 61 73 73 65 72 74 28 20 61 53 61 6d 70     assert( aSamp
16ce0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
16cf0 49 54 45 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20  ITE_FLOAT );.   
16d00 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
16d10 5b 69 5d 2e 75 2e 72 3e 3d 72 20 29 7b 0a 20 20  [i].u.r>=r ){.  
16d20 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 61          isEq = a
16d30 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3d 3d 72  Sample[i].u.r==r
16d40 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
16d50 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
16d60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
16d70 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  se if( eType==SQ
16d80 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
16d90 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    r = sqlite3_va
16da0 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29  lue_double(pVal)
16db0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
16dc0 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
16dd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
16de0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16df0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
16e00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16e10 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
16e20 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58  Type>=SQLITE_TEX
16e30 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  T ) break;.     
16e40 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16e50 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
16e60 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72  OAT ){.        r
16e70 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  S = aSample[i].u
16e80 2e 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  .r;.      }else{
16e90 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61 53  .        rS = aS
16ea0 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3b 0a 20 20  ample[i].u.i;.  
16eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16ec0 72 53 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20  rS>=r ){.       
16ed0 20 69 73 45 71 20 3d 20 72 53 3d 3d 72 3b 0a 20   isEq = rS==r;. 
16ee0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16ef0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
16f00 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53  lse if( eType==S
16f10 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
16f20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 66 28    i = 0;.    if(
16f30 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 65 54 79 70   aSample[0].eTyp
16f40 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e==SQLITE_NULL )
16f50 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 7d 65 6c   isEq = 1;.  }el
16f60 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
16f70 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  eType==SQLITE_TE
16f80 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  XT || eType==SQL
16f90 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  ITE_BLOB );.    
16fa0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
16fb0 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
16fc0 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
16fd0 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
16fe0 54 45 5f 54 45 58 54 20 7c 7c 20 61 53 61 6d 70  TE_TEXT || aSamp
16ff0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
17000 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
17010 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
17020 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
17030 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
17040 20 29 7b 20 20 20 20 20 20 0a 20 20 20 20 20 20   ){      .      
17050 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
17060 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
17070 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
17080 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
17090 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  z;.      if( eTy
170a0 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
170b0 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28  ){.        z = (
170c0 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74  const u8 *)sqlit
170d0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56  e3_value_blob(pV
170e0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  al);.        pCo
170f0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
17100 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ll;.        asse
17110 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d  rt( pColl->enc==
17120 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20  SQLITE_UTF8 );. 
17130 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17140 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
17150 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
17160 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  arse, SQLITE_UTF
17170 38 2c 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43  8, 0, *pIdx->azC
17180 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
17190 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ( pColl==0 ){.  
171a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
171b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
171c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
171d0 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73   = (const u8 *)s
171e0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
171f0 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  pVal, pColl->enc
17200 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
17210 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  z ){.          r
17220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
17230 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
17240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 20        assert( z 
17250 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  && pColl && pCol
17260 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20  l->xCmp );.     
17270 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c   }.      n = sql
17280 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28 70  ite3ValueBytes(p
17290 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  Val, pColl->enc)
172a0 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 28 3b  ;.  .      for(;
172b0 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
172c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
172d0 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
172e0 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d  nt eSampletype =
172f0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
17300 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  e;.        if( e
17310 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65  Sampletype<eType
17320 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
17330 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65       if( eSample
17340 74 79 70 65 21 3d 65 54 79 70 65 20 29 20 62 72  type!=eType ) br
17350 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eak;.#ifndef SQL
17360 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
17370 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
17380 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54  ->enc!=SQLITE_UT
17390 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F8 ){.          
173a0 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20  int nSample;.   
173b0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61         char *zSa
173c0 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74  mple = sqlite3Ut
173d0 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20  f8to16(.        
173e0 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d        db, pColl-
173f0 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  >enc, aSample[i]
17400 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  .u.z, aSample[i]
17410 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65  .nByte, &nSample
17420 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
17430 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53 61          if( !zSa
17440 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  mple ){.        
17450 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
17460 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
17470 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
17480 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
17490 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
174a0 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c         c = pColl
174b0 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
174c0 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53  ser, nSample, zS
174d0 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20  ample, n, z);.  
174e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
174f0 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c  bFree(db, zSampl
17500 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
17510 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
17520 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   {.          c =
17530 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
17540 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70  ll->pUser, aSamp
17550 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61  le[i].nByte, aSa
17560 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20  mple[i].u.z, n, 
17570 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
17580 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30 20 29        if( c>=0 )
17590 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
175a0 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20 31 3b  c==0 ) isEq = 1;
175b0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
175c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
175d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
175e0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
175f0 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  t, aSample[i] is
17600 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
17610 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
17620 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65  r than.  ** or e
17630 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f  qual to pVal.  O
17640 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  r if i==pIdx->nS
17650 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20  ample, then all 
17660 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73  samples are less
17670 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e  .  ** than pVal.
17680 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d    If aSample[i]=
17690 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73 45 71  =pVal, then isEq
176a0 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ==1..  */.  if( 
176b0 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73 73 65  isEq ){.    asse
176c0 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
176d0 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74 61 74  ple );.    aStat
176e0 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
176f0 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61 74 5b  .nLt;.    aStat[
17700 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  1] = aSample[i].
17710 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nEq;.  }else{.  
17720 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
17730 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a  , iUpper, iGap;.
17740 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
17750 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
17760 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  ;.      iUpper =
17770 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b   aSample[0].nLt;
17780 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17790 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49    iUpper = i>=pI
177a0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20  dx->nSample ? n 
177b0 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74  : aSample[i].nLt
177c0 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  ;.      iLower =
177d0 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45   aSample[i-1].nE
177e0 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  q + aSample[i-1]
177f0 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  .nLt;.    }.    
17800 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d  aStat[1] = pIdx-
17810 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66 28 20  >avgEq;.    if( 
17820 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
17830 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
17840 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17850 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
17860 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
17870 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
17880 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
17890 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
178a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
178b0 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
178c0 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
178d0 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
178e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
178f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
17900 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
17910 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a  LE_STAT3 */../*.
17920 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e  ** If expression
17930 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e 74   pExpr represent
17940 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17950 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  e, set *pp to po
17960 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c  int to.** an sql
17970 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
17980 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
17990 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20  the same value, 
179a0 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a  with affinity.**
179b0 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20   aff applied to 
179c0 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72  it, before retur
179d0 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20  ning. It is the 
179e0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
179f0 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  f the .** caller
17a00 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
17a10 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72 75  elease this stru
17a20 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e 67  cture by passing
17a30 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74   it to .** sqlit
17a40 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
17a50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
17a60 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20 72  ent parse is a r
17a70 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65  ecompile (sqlite
17a80 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61 6e  3Reprepare()) an
17a90 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e  d pExpr.** is an
17aa0 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68   SQL variable th
17ab0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  at currently has
17ac0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
17ad0 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a  e bound to it,.*
17ae0 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  * create an sqli
17af0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
17b00 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
17b10 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e  his value, again
17b20 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74   with.** affinit
17b30 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  y aff applied to
17b40 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a   it, instead..**
17b50 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f  .** If neither o
17b60 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c  f the above appl
17b70 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  y, set *pp to NU
17b80 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
17b90 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17ba0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
17bb0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
17bc0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66  QLITE_OK..*/.#if
17bd0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17be0 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63 20 69  E_STAT3.static i
17bf0 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72  nt valueFromExpr
17c00 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
17c10 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  e, .  Expr *pExp
17c20 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20  r, .  u8 aff, . 
17c30 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
17c40 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78  *pp.){.  if( pEx
17c50 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  pr->op==TK_VARIA
17c60 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72  BLE.   || (pExpr
17c70 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
17c80 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d  R && pExpr->op2=
17c90 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20  =TK_VARIABLE).  
17ca0 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20  ){.    int iVar 
17cb0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
17cc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17cd0 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
17ce0 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29  se->pVdbe, iVar)
17cf0 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69  ;.    *pp = sqli
17d00 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28  te3VdbeGetValue(
17d10 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
17d20 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b 0a  re, iVar, aff);.
17d30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17d40 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
17d50 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  rn sqlite3ValueF
17d60 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e  romExpr(pParse->
17d70 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54  db, pExpr, SQLIT
17d80 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70 29  E_UTF8, aff, pp)
17d90 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17da0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17db0 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d  is used to estim
17dc0 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
17dd0 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
17de0 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62   be visited.** b
17df0 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e  y scanning an in
17e00 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20  dex for a range 
17e10 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72  of values. The r
17e20 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e  ange may have an
17e30 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c   upper.** bound,
17e40 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20   a lower bound, 
17e50 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45  or both. The WHE
17e60 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
17e70 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70  that set the upp
17e80 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20  er.** and lower 
17e90 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65  bounds are repre
17ea0 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72  sented by pLower
17eb0 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
17ec0 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a  ectively. For.**
17ed0 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
17ee0 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20  ng that index p 
17ef0 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a  is on t1(a):.**.
17f00 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
17f10 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
17f20 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20   a < ? ....**   
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f   |_____|   |____
17f50 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _|.**           
17f60 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17f70 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17f90 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a  Lower    pUpper.
17fa0 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
17fb0 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20  of the upper or 
17fc0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e  lower bound is n
17fd0 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
17fe0 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20   NULL is passed 
17ff0 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74  in.** place of t
18000 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
18010 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
18020 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d 65  * The nEq parame
18030 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68  ter is passed th
18040 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69  e index of the i
18050 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62 6a  ndex column subj
18060 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72 61  ect to the.** ra
18070 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  nge constraint. 
18080 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79  Or, equivalently
18090 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
180a0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
180b0 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  ints.** optimize
180c0 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65  d by the propose
180d0 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f  d index scan. Fo
180e0 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
180f0 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a 2a  ing index p is.*
18100 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61  * on t1(a, b), a
18110 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  nd the SQL query
18120 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
18130 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
18140 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41   = ? AND b > ? A
18150 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND b < ? ....**.
18160 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75  ** then nEq shou
18170 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68 65  ld be passed the
18180 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68 65   value 1 (as the
18190 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
181a0 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20  d column,.** b, 
181b0 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65  is the second le
181c0 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
181d0 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72  f the index). Or
181e0 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  , if the query i
181f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
18200 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
18210 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
18220 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
18230 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
18240 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65   0..**.** The re
18250 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
18260 61 6e 20 69 6e 74 65 67 65 72 20 64 69 76 69 73  an integer divis
18270 6f 72 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  or to reduce the
18280 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20 73 65   estimated.** se
18290 61 72 63 68 20 73 70 61 63 65 2e 20 20 41 20 72  arch space.  A r
182a0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31  eturn value of 1
182b0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 61 6e 67   means that rang
182c0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
182d0 65 0a 2a 2a 20 6e 6f 20 68 65 6c 70 20 61 74 20  e.** no help at 
182e0 61 6c 6c 2e 20 20 41 20 72 65 74 75 72 6e 20 76  all.  A return v
182f0 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20  alue of 2 means 
18300 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
18310 73 20 61 72 65 0a 2a 2a 20 65 78 70 65 63 74 65  s are.** expecte
18320 64 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  d to reduce the 
18330 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
18340 68 61 6c 66 2e 20 20 41 6e 64 20 73 6f 20 66 6f  half.  And so fo
18350 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  rth....**.** In 
18360 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
18370 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c  qlite_stat3 ANAL
18380 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68 20 72  YZE data, each r
18390 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 0a  ange inequality.
183a0 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 73  ** reduces the s
183b0 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
183c0 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 20 48   factor of 4.  H
183d0 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f  ence a single co
183e0 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a  nstraint (x>?).*
183f0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72  * results in a r
18400 65 74 75 72 6e 20 6f 66 20 34 20 61 6e 64 20 61  eturn of 4 and a
18410 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
18420 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  t (x>? AND x<?) 
18430 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20  results.** in a 
18440 72 65 74 75 72 6e 20 6f 66 20 31 36 2e 0a 2a 2f  return of 16..*/
18450 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18460 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
18470 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18480 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18490 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
184a0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
184b0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
184c0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
184d0 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  x containing the
184e0 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20   range-compared 
184f0 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20  column; "x" */. 
18500 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20   int nEq,       
18510 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69        /* index i
18520 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66  nto p->aCol[] of
18530 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61   the range-compa
18540 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  red column */.  
18550 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
18560 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
18570 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
18580 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
18590 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
185a0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
185b0 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
185c0 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
185d0 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
185e0 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
185f0 20 20 64 6f 75 62 6c 65 20 2a 70 52 61 6e 67 65    double *pRange
18600 44 69 76 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65  Div   /* OUT: Re
18610 64 75 63 65 20 73 65 61 72 63 68 20 73 70 61 63  duce search spac
18620 65 20 62 79 20 74 68 69 73 20 64 69 76 69 73 6f  e by this diviso
18630 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
18640 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
18650 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18660 42 4c 45 5f 53 54 41 54 33 0a 0a 20 20 69 66 28  BLE_STAT3..  if(
18670 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e 53   nEq==0 && p->nS
18680 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  ample ){.    sql
18690 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e  ite3_value *pRan
186a0 67 65 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77 63  geVal;.    tRowc
186b0 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20  nt iLower = 0;. 
186c0 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
186d0 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  r = p->aiRowEst[
186e0 30 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  0];.    tRowcnt 
186f0 61 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66  a[2];.    u8 aff
18700 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   = p->pTable->aC
18710 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  ol[p->aiColumn[0
18720 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20  ]].affinity;..  
18730 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
18740 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
18750 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70  r = pLower->pExp
18760 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
18770 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
18780 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
18790 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56  r, aff, &pRangeV
187a0 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
187b0 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  t( (pLower->eOpe
187c0 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
187d0 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_GE))!=0 );.   
187e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
187f0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77  E_OK.       && w
18800 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
18810 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61  rse, p, pRangeVa
18820 6c 2c 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54 45  l, 0, a)==SQLITE
18830 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  _OK.      ){.   
18840 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
18850 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
18860 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74  (pLower->eOperat
18870 6f 72 20 26 20 57 4f 5f 47 54 29 21 3d 30 20 29  or & WO_GT)!=0 )
18880 20 69 4c 6f 77 65 72 20 2b 3d 20 61 5b 31 5d 3b   iLower += a[1];
18890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
188a0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
188b0 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20  pRangeVal);.    
188c0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
188d0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 55 70 70 65  LITE_OK && pUppe
188e0 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  r ){.      Expr 
188f0 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d  *pExpr = pUpper-
18900 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
18910 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65        rc = value
18920 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
18930 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52   pExpr, aff, &pR
18940 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20 20  angeVal);.      
18950 61 73 73 65 72 74 28 20 28 70 55 70 70 65 72 2d  assert( (pUpper-
18960 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
18970 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29  _LT|WO_LE))!=0 )
18980 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
18990 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
189a0 20 26 26 20 77 68 65 72 65 4b 65 79 53 74 61 74   && whereKeyStat
189b0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 61  s(pParse, p, pRa
189c0 6e 67 65 56 61 6c 2c 20 31 2c 20 61 29 3d 3d 53  ngeVal, 1, a)==S
189d0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29  QLITE_OK.      )
189e0 7b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  {.        iUpper
189f0 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20   = a[0];.       
18a00 20 69 66 28 20 28 70 55 70 70 65 72 2d 3e 65 4f   if( (pUpper->eO
18a10 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29  perator & WO_LE)
18a20 21 3d 30 20 29 20 69 55 70 70 65 72 20 2b 3d 20  !=0 ) iUpper += 
18a30 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  a[1];.      }.  
18a40 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
18a50 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29 3b  Free(pRangeVal);
18a60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18a70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18a80 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72        if( iUpper
18a90 3c 3d 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  <=iLower ){.    
18aa0 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d      *pRangeDiv =
18ab0 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52 6f   (double)p->aiRo
18ac0 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20 7d  wEst[0];.      }
18ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
18ae0 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62  RangeDiv = (doub
18af0 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30  le)p->aiRowEst[0
18b00 5d 2f 28 64 6f 75 62 6c 65 29 28 69 55 70 70 65  ]/(double)(iUppe
18b10 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20  r - iLower);.   
18b20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45     }.      WHERE
18b30 54 52 41 43 45 28 28 22 72 61 6e 67 65 20 73 63  TRACE(("range sc
18b40 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e  an regions: %u..
18b50 25 75 20 20 64 69 76 3d 25 67 5c 6e 22 2c 0a 20  %u  div=%g\n",. 
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b70 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75   (u32)iLower, (u
18b80 33 32 29 69 55 70 70 65 72 2c 20 2a 70 52 61 6e  32)iUpper, *pRan
18b90 67 65 44 69 76 29 29 3b 0a 20 20 20 20 20 20 72  geDiv));.      r
18ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18bb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
18bc0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
18bd0 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
18be0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18bf0 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  p);.  UNUSED_PAR
18c00 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e  AMETER(nEq);.#en
18c10 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c  dif.  assert( pL
18c20 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29  ower || pUpper )
18c30 3b 0a 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d  ;.  *pRangeDiv =
18c40 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69 66   (double)1;.  if
18c50 28 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f  ( pLower && (pLo
18c60 77 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  wer->wtFlags & T
18c70 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20  ERM_VNULL)==0 ) 
18c80 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20 28 64  *pRangeDiv *= (d
18c90 6f 75 62 6c 65 29 34 3b 0a 20 20 69 66 28 20 70  ouble)4;.  if( p
18ca0 55 70 70 65 72 20 29 20 2a 70 52 61 6e 67 65 44  Upper ) *pRangeD
18cb0 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b  iv *= (double)4;
18cc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18cd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18ce0 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a  NABLE_STAT3./*.*
18cf0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
18d00 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
18d10 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
18d20 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
18d30 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
18d40 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
18d50 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
18d60 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
18d70 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
18d80 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
18d90 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
18da0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
18db0 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
18dc0 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
18dd0 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
18de0 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
18df0 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
18e00 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
18e10 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
18e20 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
18e30 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
18e40 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
18e50 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
18e60 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
18e70 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
18e80 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
18e90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
18ea0 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
18eb0 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
18ec0 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
18ed0 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
18ee0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
18ef0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18f00 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
18f10 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
18f20 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
18f30 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
18f40 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
18f50 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
18f60 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
18f70 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
18f80 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
18f90 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
18fa0 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
18fb0 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
18fc0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
18fd0 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
18fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18ff0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
19000 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
19010 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
19020 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
19030 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
19040 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
19050 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
19060 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73  x whose left-mos
19070 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72  t column is pTer
19080 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  m */.  Expr *pEx
19090 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  pr,         /* E
190a0 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41  xpression for VA
190b0 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c  LUE in the x=VAL
190c0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
190d0 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77  .  double *pnRow
190e0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
190f0 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
19100 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
19110 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
19120 61 6c 75 65 20 2a 70 52 68 73 20 3d 20 30 3b 20  alue *pRhs = 0; 
19130 20 2f 2a 20 56 41 4c 55 45 20 6f 6e 20 72 69 67   /* VALUE on rig
19140 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
19150 70 54 65 72 6d 20 2a 2f 0a 20 20 75 38 20 61 66  pTerm */.  u8 af
19160 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
19170 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61       /* Column a
19180 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74  ffinity */.  int
19190 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
191a0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
191b0 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
191c0 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  e */.  tRowcnt a
191d0 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
191e0 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a   /* Statistics *
191f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
19200 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
19210 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70  assert( p->nSamp
19220 6c 65 3e 30 20 29 3b 0a 20 20 61 66 66 20 3d 20  le>0 );.  aff = 
19230 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  p->pTable->aCol[
19240 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e  p->aiColumn[0]].
19250 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
19260 70 45 78 70 72 20 29 7b 0a 20 20 20 20 72 63 20  pExpr ){.    rc 
19270 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
19280 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
19290 66 66 2c 20 26 70 52 68 73 29 3b 0a 20 20 20 20  ff, &pRhs);.    
192a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
192b0 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f  ereEqualScanEst_
192c0 63 61 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b  cancel;.  }else{
192d0 0a 20 20 20 20 70 52 68 73 20 3d 20 73 71 6c 69  .    pRhs = sqli
192e0 74 65 33 56 61 6c 75 65 4e 65 77 28 70 50 61 72  te3ValueNew(pPar
192f0 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 69  se->db);.  }.  i
19300 66 28 20 70 52 68 73 3d 3d 30 20 29 20 72 65 74  f( pRhs==0 ) ret
19310 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
19320 55 4e 44 3b 0a 20 20 72 63 20 3d 20 77 68 65 72  UND;.  rc = wher
19330 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
19340 2c 20 70 2c 20 70 52 68 73 2c 20 30 2c 20 61 29  , p, pRhs, 0, a)
19350 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 57 48 45  TE_OK ){.    WHE
19370 52 45 54 52 41 43 45 28 28 22 65 71 75 61 6c 69  RETRACE(("equali
19380 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ty scan regions:
19390 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31   %d\n", (int)a[1
193a0 5d 29 29 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  ]));.    *pnRow 
193b0 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72  = a[1];.  }.wher
193c0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
193d0 6e 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56  ncel:.  sqlite3V
193e0 61 6c 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a  alueFree(pRhs);.
193f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
19400 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
19410 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
19420 54 41 54 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66  TAT3) */..#ifdef
19430 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
19440 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT3./*.** Estim
19450 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
19460 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
19470 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
19480 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63  ed on.** an IN c
19490 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20  onstraint where 
194a0 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
194b0 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
194c0 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c  erator.** is a l
194d0 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20  ist of values.  
194e0 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
194f0 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
19500 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a   (1,2,3,4).**.**
19510 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
19520 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
19530 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
19540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
19550 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
19560 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
19570 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
19580 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
19590 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
195a0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
195b0 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
195c0 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
195d0 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
195e0 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
195f0 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
19600 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
19610 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
19620 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
19630 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
19640 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
19650 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
19660 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
19670 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
19680 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
19690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
196a0 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20  hereInScanEst(. 
196b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
196c0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
196d0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
196e0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
196f0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
19700 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
19710 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73  x whose left-mos
19720 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72  t column is pTer
19730 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  m */.  ExprList 
19740 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
19750 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
19760 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
19770 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
19780 22 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70  " */.  double *p
19790 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57  nRow        /* W
197a0 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
197b0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
197c0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
197d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
197e0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
197f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
19800 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 45  e */.  double nE
19810 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
19820 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19830 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  rows for a singl
19840 65 20 74 65 72 6d 20 2a 2f 0a 20 20 64 6f 75 62  e term */.  doub
19850 6c 65 20 6e 52 6f 77 45 73 74 20 3d 20 28 64 6f  le nRowEst = (do
19860 75 62 6c 65 29 30 3b 20 2f 2a 20 4e 65 77 20 65  uble)0; /* New e
19870 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
19880 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
19890 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
198b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
198c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
198d0 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
198e0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
198f0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73  ITE_OK && i<pLis
19900 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
19910 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69      nEst = p->ai
19920 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72  RowEst[0];.    r
19930 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
19940 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 2c  anEst(pParse, p,
19950 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
19960 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20  pr, &nEst);.    
19970 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b  nRowEst += nEst;
19980 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
19990 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
199a0 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d  if( nRowEst > p-
199b0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e  >aiRowEst[0] ) n
199c0 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f  RowEst = p->aiRo
199d0 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e  wEst[0];.    *pn
199e0 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20  Row = nRowEst;. 
199f0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
19a00 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a  IN row estimate:
19a10 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77   est=%g\n", nRow
19a20 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Est));.  }.  ret
19a30 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
19a40 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
19a50 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
19a60 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b   */../*.** Check
19a70 20 74 6f 20 73 65 65 20 69 66 20 63 6f 6c 75 6d   to see if colum
19a80 6e 20 69 43 6f 6c 20 6f 66 20 74 68 65 20 74 61  n iCol of the ta
19a90 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
19aa0 69 54 61 62 20 77 69 6c 6c 20 61 70 70 65 61 72  iTab will appear
19ab0 0a 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  .** in sorted or
19ac0 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  der according to
19ad0 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75 65   the current que
19ae0 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 52  ry plan..**.** R
19af0 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a  eturn values:.**
19b00 0a 2a 2a 20 20 20 20 30 20 20 20 69 43 6f 6c 20  .**    0   iCol 
19b10 69 73 20 6e 6f 74 20 6f 72 64 65 72 65 64 0a 2a  is not ordered.*
19b20 2a 20 20 20 20 31 20 20 20 69 43 6f 6c 20 68 61  *    1   iCol ha
19b30 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
19b40 76 61 6c 75 65 0a 2a 2a 20 20 20 20 32 20 20 20  value.**    2   
19b50 69 43 6f 6c 20 69 73 20 69 6e 20 41 53 43 20 6f  iCol is in ASC o
19b60 72 64 65 72 0a 2a 2a 20 20 20 20 33 20 20 20 69  rder.**    3   i
19b70 43 6f 6c 20 69 73 20 69 6e 20 44 45 53 43 20 6f  Col is in DESC o
19b80 72 64 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rder.*/.static i
19b90 6e 74 20 69 73 4f 72 64 65 72 65 64 43 6f 6c 75  nt isOrderedColu
19ba0 6d 6e 28 0a 20 20 57 68 65 72 65 42 65 73 74 49  mn(.  WhereBestI
19bb0 64 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 54 61  dx *p,.  int iTa
19bc0 62 2c 0a 20 20 69 6e 74 20 69 43 6f 6c 0a 29 7b  b,.  int iCol.){
19bd0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 57  .  int i, j;.  W
19be0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
19bf0 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 70  l = &p->aLevel[p
19c00 2d 3e 69 2d 31 5d 3b 0a 20 20 49 6e 64 65 78 20  ->i-1];.  Index 
19c10 2a 70 49 64 78 3b 0a 20 20 75 38 20 73 6f 72 74  *pIdx;.  u8 sort
19c20 4f 72 64 65 72 3b 0a 20 20 66 6f 72 28 69 3d 70  Order;.  for(i=p
19c30 2d 3e 69 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ->i-1; i>=0; i--
19c40 2c 20 70 4c 65 76 65 6c 2d 2d 29 7b 0a 20 20 20  , pLevel--){.   
19c50 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 54 61   if( pLevel->iTa
19c60 62 43 75 72 21 3d 69 54 61 62 20 29 20 63 6f 6e  bCur!=iTab ) con
19c70 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
19c80 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
19c90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c 4c  lags & WHERE_ALL
19ca0 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20  _UNIQUE)!=0 ){. 
19cb0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
19cc0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
19cd0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
19ce0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
19cf0 52 44 45 52 45 44 29 21 3d 30 20 29 3b 0a 20 20  RDERED)!=0 );.  
19d00 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 70 4c    if( (pIdx = pL
19d10 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
19d20 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  x)!=0 ){.      i
19d30 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
19d40 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d       sortOrder =
19d50 20 30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   0;.        test
19d60 63 61 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e 70  case( (pLevel->p
19d70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
19d80 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 20  ERE_REVERSE)!=0 
19d90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
19da0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
19db0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
19dc0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
19dd0 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<n; j++){.     
19de0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70       if( iCol==p
19df0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
19e00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
19e10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
19e20 6a 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  j>=n ) return 0;
19e30 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 72 64  .        sortOrd
19e40 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  er = pIdx->aSort
19e50 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
19e60 20 20 74 65 73 74 63 61 73 65 28 20 28 70 4c 65    testcase( (pLe
19e70 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
19e80 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53  s & WHERE_REVERS
19e90 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  E)!=0 );.      }
19ea0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19eb0 20 20 69 66 28 20 69 43 6f 6c 21 3d 28 2d 31 29    if( iCol!=(-1)
19ec0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
19ed0 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30     sortOrder = 0
19ee0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19ef0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
19f00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19f10 52 45 56 45 52 53 45 29 21 3d 30 20 29 3b 0a 20  REVERSE)!=0 );. 
19f20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4c     }.    if( (pL
19f30 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
19f40 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52  gs & WHERE_REVER
19f50 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)!=0 ){.      
19f60 61 73 73 65 72 74 28 20 73 6f 72 74 4f 72 64 65  assert( sortOrde
19f70 72 3d 3d 30 20 7c 7c 20 73 6f 72 74 4f 72 64 65  r==0 || sortOrde
19f80 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  r==1 );.      te
19f90 73 74 63 61 73 65 28 20 73 6f 72 74 4f 72 64 65  stcase( sortOrde
19fa0 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 6f  r==1 );.      so
19fb0 72 74 4f 72 64 65 72 20 3d 20 31 20 2d 20 73 6f  rtOrder = 1 - so
19fc0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
19fd0 20 20 20 72 65 74 75 72 6e 20 73 6f 72 74 4f 72     return sortOr
19fe0 64 65 72 2b 32 3b 0a 20 20 7d 0a 20 20 72 65 74  der+2;.  }.  ret
19ff0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1a000 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63  This routine dec
1a010 69 64 65 73 20 69 66 20 70 49 64 78 20 63 61 6e  ides if pIdx can
1a020 20 62 65 20 75 73 65 64 20 74 6f 20 73 61 74 69   be used to sati
1a030 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
1a040 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 65 69 74 68  .** clause, eith
1a050 65 72 20 69 6e 20 77 68 6f 6c 65 20 6f 72 20 69  er in whole or i
1a060 6e 20 70 61 72 74 2e 20 20 54 68 65 20 72 65 74  n part.  The ret
1a070 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
1a080 20 0a 2a 2a 20 63 75 6d 75 6c 61 74 69 76 65 20   .** cumulative 
1a090 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  number of terms 
1a0a0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1a0b0 63 6c 61 75 73 65 20 74 68 61 74 20 61 72 65 20  clause that are 
1a0c0 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
1a0d0 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 61  the index pIdx a
1a0e0 6e 64 20 6f 74 68 65 72 20 69 6e 64 69 63 65 73  nd other indices
1a0f0 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e   in outer loops.
1a100 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
1a110 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 68   being queried h
1a120 61 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62  as a cursor numb
1a130 65 72 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70  er of "base".  p
1a140 49 64 78 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e  Idx is the.** in
1a150 64 65 78 20 74 68 61 74 20 69 73 20 70 6f 73 74  dex that is post
1a160 75 6c 61 74 65 64 20 66 6f 72 20 75 73 65 20 74  ulated for use t
1a170 6f 20 61 63 63 65 73 73 20 74 68 65 20 74 61 62  o access the tab
1a180 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 2a 70  le..**.** The *p
1a190 62 52 65 76 20 76 61 6c 75 65 20 69 73 20 73 65  bRev value is se
1a1a0 74 20 74 6f 20 30 20 6f 72 64 65 72 20 31 20 64  t to 0 order 1 d
1a1b0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
1a1c0 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 70 49  her or not.** pI
1a1d0 64 78 20 73 68 6f 75 6c 64 20 62 65 20 72 75 6e  dx should be run
1a1e0 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20   in the forward 
1a1f0 6f 72 64 65 72 20 6f 72 20 69 6e 20 72 65 76 65  order or in reve
1a200 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  rse order..*/.st
1a210 61 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69  atic int isSorti
1a220 6e 67 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  ngIndex(.  Where
1a230 42 65 73 74 49 64 78 20 2a 70 2c 20 20 20 20 2f  BestIdx *p,    /
1a240 2a 20 42 65 73 74 20 69 6e 64 65 78 20 73 65 61  * Best index sea
1a250 72 63 68 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rch context */. 
1a260 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
1a270 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1a280 78 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67  x we are testing
1a290 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20   */.  int base, 
1a2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1a2b0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
1a2c0 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73  he table to be s
1a2d0 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  orted */.  int *
1a2e0 70 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 2f  pbRev,         /
1a2f0 2a 20 53 65 74 20 74 6f 20 31 20 66 6f 72 20 72  * Set to 1 for r
1a300 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73 63 61  everse-order sca
1a310 6e 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 69  n of pIdx */.  i
1a320 6e 74 20 2a 70 62 4f 62 55 6e 69 71 75 65 20 20  nt *pbObUnique  
1a330 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63     /* ORDER BY c
1a340 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 77 69 6c  olumn values wil
1a350 6c 20 64 69 66 66 65 72 65 6e 74 20 69 6e 20 65  l different in e
1a360 76 65 72 79 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20  very row */.){. 
1a370 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a390 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 49 64 78  * Number of pIdx
1a3a0 20 74 65 72 6d 73 20 75 73 65 64 20 2a 2f 0a 20   terms used */. 
1a3b0 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a3d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
1a3e0 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
1a3f0 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  fied */.  int so
1a400 72 74 4f 72 64 65 72 20 3d 20 32 3b 20 20 20 20  rtOrder = 2;    
1a410 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 66 6f          /* 0: fo
1a420 72 77 61 72 64 2e 20 20 31 3a 20 62 61 63 6b 77  rward.  1: backw
1a430 61 72 64 2e 20 20 32 3a 20 75 6e 6b 6e 6f 77 6e  ard.  2: unknown
1a440 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a460 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a470 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1a480 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
1a490 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 42 49 74  List_item *pOBIt
1a4a0 65 6d 3b 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20  em;/* A term of 
1a4b0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1a4c0 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  use */.  Table *
1a4d0 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  pTab = pIdx->pTa
1a4e0 62 6c 65 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20  ble;   /* Table 
1a4f0 74 68 61 74 20 6f 77 6e 73 20 69 6e 64 65 78 20  that owns index 
1a500 70 49 64 78 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pIdx */.  ExprLi
1a510 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
1a520 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
1a530 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1a540 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
1a550 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 20  e = p->pParse;  
1a560 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
1a570 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
1a580 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1a590 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61  b;     /* Databa
1a5a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1a5b0 0a 20 20 69 6e 74 20 6e 50 72 69 6f 72 53 61 74  .  int nPriorSat
1a5c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a5d0 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   /* ORDER BY ter
1a5e0 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20  ms satisfied by 
1a5f0 6f 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20  outer loops */. 
1a600 20 69 6e 74 20 73 65 65 6e 52 6f 77 69 64 20 3d   int seenRowid =
1a610 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
1a620 2a 20 54 72 75 65 20 69 66 20 61 6e 20 4f 52 44  * True if an ORD
1a630 45 52 20 42 59 20 72 6f 77 69 64 20 74 65 72 6d  ER BY rowid term
1a640 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
1a650 74 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 3b  t uniqueNotNull;
1a660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
1a670 49 64 78 20 69 73 20 55 4e 49 51 55 45 20 77 69  Idx is UNIQUE wi
1a680 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65  th all terms are
1a690 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69   NOT NULL */.  i
1a6a0 6e 74 20 6f 75 74 65 72 4f 62 55 6e 69 71 75 65  nt outerObUnique
1a6b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1a6c0 4f 75 74 65 72 20 6c 6f 6f 70 73 20 67 65 6e 65  Outer loops gene
1a6d0 72 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 76  rate different v
1a6e0 61 6c 75 65 73 20 69 6e 0a 20 20 20 20 20 20 20  alues in.       
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a700 20 20 20 20 20 20 20 20 20 2a 2a 20 65 76 65 72           ** ever
1a710 79 20 72 6f 77 20 66 6f 72 20 74 68 65 20 4f 52  y row for the OR
1a720 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 73 20 2a  DER BY columns *
1a730 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30  /..  if( p->i==0
1a740 20 29 7b 0a 20 20 20 20 6e 50 72 69 6f 72 53 61   ){.    nPriorSa
1a750 74 20 3d 20 30 3b 0a 20 20 20 20 6f 75 74 65 72  t = 0;.    outer
1a760 4f 62 55 6e 69 71 75 65 20 3d 20 31 3b 0a 20 20  ObUnique = 1;.  
1a770 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 69 6f  }else{.    nPrio
1a780 72 53 61 74 20 3d 20 70 2d 3e 61 4c 65 76 65 6c  rSat = p->aLevel
1a790 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f  [p->i-1].plan.nO
1a7a0 42 53 61 74 3b 0a 20 20 20 20 69 66 28 20 28 70  BSat;.    if( (p
1a7b0 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1a7c0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1a7d0 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 3d 3d  WHERE_ORDERED)==
1a7e0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1a7f0 69 73 20 6c 6f 6f 70 20 63 61 6e 6e 6f 74 20 62  is loop cannot b
1a800 65 20 6f 72 64 65 72 65 64 20 75 6e 6c 65 73 73  e ordered unless
1a810 20 74 68 65 20 6e 65 78 74 20 6f 75 74 65 72 20   the next outer 
1a820 6c 6f 6f 70 20 69 73 0a 20 20 20 20 20 20 2a 2a  loop is.      **
1a830 20 61 6c 73 6f 20 6f 72 64 65 72 65 64 20 2a 2f   also ordered */
1a840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 50  .      return nP
1a850 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a 20  riorSat;.    }. 
1a860 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74     if( Optimizat
1a870 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1a880 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
1a890 78 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  xJoin) ){.      
1a8a0 2f 2a 20 4f 6e 6c 79 20 6c 6f 6f 6b 20 61 74 20  /* Only look at 
1a8b0 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 20 6c  the outer-most l
1a8c0 6f 6f 70 20 69 66 20 74 68 65 20 4f 72 64 65 72  oop if the Order
1a8d0 42 79 49 64 78 4a 6f 69 6e 0a 20 20 20 20 20 20  ByIdxJoin.      
1a8e0 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
1a8f0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
1a900 20 20 20 20 20 72 65 74 75 72 6e 20 6e 50 72 69       return nPri
1a910 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a 20 20 20  orSat;.    }.   
1a920 20 6f 75 74 65 72 4f 62 55 6e 69 71 75 65 20 3d   outerObUnique =
1a930 20 28 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69   (p->aLevel[p->i
1a940 2d 31 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  -1].plan.wsFlags
1a950 20 26 20 57 48 45 52 45 5f 4f 42 5f 55 4e 49 51   & WHERE_OB_UNIQ
1a960 55 45 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 70 4f  UE)!=0;.  }.  pO
1a970 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
1a980 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20  erBy;.  assert( 
1a990 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
1a9a0 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
1a9b0 64 65 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  dered ){.    /* 
1a9c0 48 61 73 68 20 69 6e 64 69 63 65 73 20 28 69 6e  Hash indices (in
1a9d0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 22  dicated by the "
1a9e0 75 6e 6f 72 64 65 72 65 64 22 20 74 61 67 20 6f  unordered" tag o
1a9f0 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 31 29 20  n sqlite_stat1) 
1aa00 63 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65  cannot.    ** be
1aa10 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e   used for sortin
1aa20 67 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  g */.    return 
1aa30 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 7d 0a 20  nPriorSat;.  }. 
1aa40 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42   nTerm = pOrderB
1aa50 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 75 6e 69 71  y->nExpr;.  uniq
1aa60 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20 70 49 64 78  ueNotNull = pIdx
1aa70 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
1aa80 6e 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  ne;.  assert( nT
1aa90 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  erm>0 );..  /* A
1aaa0 72 67 75 6d 65 6e 74 20 70 49 64 78 20 6d 75 73  rgument pIdx mus
1aab0 74 20 65 69 74 68 65 72 20 70 6f 69 6e 74 20 74  t either point t
1aac0 6f 20 61 20 27 72 65 61 6c 27 20 6e 61 6d 65 64  o a 'real' named
1aad0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
1aae0 2c 20 0a 20 20 2a 2a 20 6f 72 20 61 6e 20 69 6e  , .  ** or an in
1aaf0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6c  dex structure al
1ab00 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73  located on the s
1ab10 74 61 63 6b 20 62 79 20 62 65 73 74 42 74 72 65  tack by bestBtre
1ab20 65 49 6e 64 65 78 28 29 20 74 6f 0a 20 20 2a 2a  eIndex() to.  **
1ab30 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
1ab40 6f 77 69 64 20 69 6e 64 65 78 20 74 68 61 74 20  owid index that 
1ab50 69 73 20 70 61 72 74 20 6f 66 20 65 76 65 72 79  is part of every
1ab60 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 61 73   table.  */.  as
1ab70 73 65 72 74 28 20 70 49 64 78 2d 3e 7a 4e 61 6d  sert( pIdx->zNam
1ab80 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  e || (pIdx->nCol
1ab90 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e  umn==1 && pIdx->
1aba0 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d 31 29  aiColumn[0]==-1)
1abb0 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20   );..  /* Match 
1abc0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1abd0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 67 61  ER BY clause aga
1abe0 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a  inst columns of.
1abf0 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a    ** the index..
1ac00 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
1ac10 68 61 74 20 69 6e 64 69 63 65 73 20 68 61 76 65  hat indices have
1ac20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72   pIdx->nColumn r
1ac30 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70  egular columns p
1ac40 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64  lus.  ** one add
1ac50 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63  itional column c
1ac60 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f  ontaining the ro
1ac70 77 69 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  wid.  The rowid 
1ac80 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74  column.  ** of t
1ac90 68 65 20 69 6e 64 65 78 20 69 73 20 61 6c 73 6f  he index is also
1aca0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63   allowed to matc
1acb0 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 4f 52  h against the OR
1acc0 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75  DER BY.  ** clau
1acd0 73 65 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 6e  se..  */.  j = n
1ace0 50 72 69 6f 72 53 61 74 3b 0a 20 20 66 6f 72 28  PriorSat;.  for(
1acf0 69 3d 30 2c 70 4f 42 49 74 65 6d 3d 26 70 4f 72  i=0,pOBItem=&pOr
1ad00 64 65 72 42 79 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e  derBy->a[j]; j<n
1ad10 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d  Term && i<=pIdx-
1ad20 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
1ad30 20 20 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70      Expr *pOBExp
1ad40 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r;          /* T
1ad50 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
1ad60 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 4f   the ORDER BY pO
1ad70 42 49 74 65 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c  BItem */.    Col
1ad80 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
1ad90 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
1ada0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
1adb0 66 20 70 4f 42 45 78 70 72 20 2a 2f 0a 20 20 20  f pOBExpr */.   
1adc0 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64   int termSortOrd
1add0 65 72 3b 20 20 20 20 20 20 2f 2a 20 53 6f 72 74  er;      /* Sort
1ade0 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
1adf0 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  term */.    int 
1ae00 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
1ae10 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
1ae20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1ae30 64 65 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77  dex.  -1 for row
1ae40 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53  id */.    int iS
1ae50 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20  ortOrder;       
1ae60 20 20 2f 2a 20 31 20 66 6f 72 20 44 45 53 43 2c    /* 1 for DESC,
1ae70 20 30 20 66 6f 72 20 41 53 43 20 6f 6e 20 74 68   0 for ASC on th
1ae80 65 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72  e i-th index ter
1ae90 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 45  m */.    int isE
1aea0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
1aeb0 20 2f 2a 20 53 75 62 6a 65 63 74 20 74 6f 20 61   /* Subject to a
1aec0 6e 20 3d 3d 20 6f 72 20 49 53 20 4e 55 4c 4c 20  n == or IS NULL 
1aed0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
1aee0 20 20 69 6e 74 20 69 73 4d 61 74 63 68 3b 20 20    int isMatch;  
1aef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44            /* ORD
1af00 45 52 20 42 59 20 74 65 72 6d 20 6d 61 74 63 68  ER BY term match
1af10 65 73 20 74 68 65 20 69 6e 64 65 78 20 74 65 72  es the index ter
1af20 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  m */.    const c
1af30 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
1af40 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
1af50 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
1af60 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65  or i-th index te
1af70 72 6d 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  rm */.    WhereT
1af80 65 72 6d 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74  erm *pConstraint
1af90 3b 20 2f 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e  ; /* A constrain
1afa0 74 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  t in the WHERE c
1afb0 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lause */..    /*
1afc0 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 65 72   If the next ter
1afd0 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
1afe0 59 20 63 6c 61 75 73 65 20 72 65 66 65 72 73 20  Y clause refers 
1aff0 74 6f 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  to anything othe
1b000 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 61 20  r than.    ** a 
1b010 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 22 62  column in the "b
1b020 61 73 65 22 20 74 61 62 6c 65 2c 20 74 68 65 6e  ase" table, then
1b030 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c   this index will
1b040 20 6e 6f 74 20 62 65 20 6f 66 20 61 6e 79 0a 20   not be of any. 
1b050 20 20 20 2a 2a 20 66 75 72 74 68 65 72 20 75 73     ** further us
1b060 65 20 69 6e 20 68 61 6e 64 6c 69 6e 67 20 74 68  e in handling th
1b070 65 20 4f 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20  e ORDER BY. */. 
1b080 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
1b090 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1b0a0 61 74 65 28 70 4f 42 49 74 65 6d 2d 3e 70 45 78  ate(pOBItem->pEx
1b0b0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 42  pr);.    if( pOB
1b0c0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
1b0d0 55 4d 4e 20 7c 7c 20 70 4f 42 45 78 70 72 2d 3e  UMN || pOBExpr->
1b0e0 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a  iTable!=base ){.
1b0f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b100 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
1b110 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
1b120 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
1b130 65 6e 63 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ence for the nex
1b140 74 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 69  t entry.    ** i
1b150 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  n the index */. 
1b160 20 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61     if( pIdx->zNa
1b170 6d 65 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43  me && i<pIdx->nC
1b180 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69  olumn ){.      i
1b190 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61  Column = pIdx->a
1b1a0 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
1b1b0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
1b1c0 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  Idx->pTable->iPK
1b1d0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  ey ){.        iC
1b1e0 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
1b1f0 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f    }.      iSortO
1b200 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f  rder = pIdx->aSo
1b210 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
1b220 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e    zColl = pIdx->
1b230 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
1b240 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d   assert( zColl!=
1b250 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
1b260 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
1b270 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f  -1;.      iSortO
1b280 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rder = 0;.      
1b290 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  zColl = 0;.    }
1b2a0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
1b2b0 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
1b2c0 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 63  umn number and c
1b2d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1b2e0 65 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  e of the.    ** 
1b2f0 69 6e 64 65 78 20 6d 61 74 63 68 20 74 68 65 20  index match the 
1b300 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
1b310 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
1b320 65 6e 63 65 20 6f 66 20 74 68 65 20 4f 52 44 45  ence of the ORDE
1b330 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75  R BY.    ** clau
1b340 73 65 20 65 6e 74 72 79 2e 20 20 53 65 74 20 69  se entry.  Set i
1b350 73 4d 61 74 63 68 20 74 6f 20 31 20 69 66 20 74  sMatch to 1 if t
1b360 68 65 79 20 62 6f 74 68 20 6d 61 74 63 68 2e 20  hey both match. 
1b370 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 42 45 78  */.    if( pOBEx
1b380 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  pr->iColumn==iCo
1b390 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  lumn ){.      if
1b3a0 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( zColl ){.     
1b3b0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1b3c0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1b3d0 61 72 73 65 2c 20 70 4f 42 49 74 65 6d 2d 3e 70  arse, pOBItem->p
1b3e0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1b3f0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
1b400 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
1b410 6c 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  l;.        isMat
1b420 63 68 20 3d 20 73 71 6c 69 74 65 33 53 74 72 49  ch = sqlite3StrI
1b430 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
1b440 2c 20 7a 43 6f 6c 6c 29 3d 3d 30 3b 0a 20 20 20  , zColl)==0;.   
1b450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b460 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
1b470 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1b480 7b 0a 20 20 20 20 20 20 69 73 4d 61 74 63 68 20  {.      isMatch 
1b490 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
1b4a0 2f 2a 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  /* termSortOrder
1b4b0 20 69 73 20 30 20 6f 72 20 31 20 66 6f 72 20 77   is 0 or 1 for w
1b4c0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
1b4d0 65 20 61 63 63 65 73 73 20 6c 6f 6f 70 20 73 68  e access loop sh
1b4e0 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 72 75 6e 20  ould.    ** run 
1b4f0 66 6f 72 77 61 72 64 20 6f 72 20 62 61 63 6b 77  forward or backw
1b500 61 72 64 73 20 28 72 65 73 70 65 63 74 69 76 65  ards (respective
1b510 6c 79 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ly) in order to 
1b520 73 61 74 69 73 66 79 20 74 68 69 73 20 0a 20 20  satisfy this .  
1b530 20 20 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65    ** term of the
1b540 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b550 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1b560 20 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   pOBItem->sortOr
1b570 64 65 72 3d 3d 30 20 7c 7c 20 70 4f 42 49 74 65  der==0 || pOBIte
1b580 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20  m->sortOrder==1 
1b590 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1b5a0 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20  SortOrder==0 || 
1b5b0 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b  iSortOrder==1 );
1b5c0 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64  .    termSortOrd
1b5d0 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72 20  er = iSortOrder 
1b5e0 5e 20 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f  ^ pOBItem->sortO
1b5f0 72 64 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  rder;..    /* If
1b600 20 58 20 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e   X is the column
1b610 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 6e   in the index an
1b620 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  d ORDER BY claus
1b630 65 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 0a  e, check to see.
1b640 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20      ** if there 
1b650 61 72 65 20 61 6e 79 20 58 3d 20 6f 72 20 58 20  are any X= or X 
1b660 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  IS NULL constrai
1b670 6e 74 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  nts in the WHERE
1b680 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
1b690 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 66 69  pConstraint = fi
1b6a0 6e 64 54 65 72 6d 28 70 2d 3e 70 57 43 2c 20 62  ndTerm(p->pWC, b
1b6b0 61 73 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 70 2d  ase, iColumn, p-
1b6c0 3e 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20  >notReady,.     
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 20 20 20 57 4f 5f 45 51 7c 57 4f 5f 49        WO_EQ|WO_I
1b6f0 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 2c 20 70 49 64  SNULL|WO_IN, pId
1b700 78 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  x);.    if( pCon
1b710 73 74 72 61 69 6e 74 3d 3d 30 20 29 7b 0a 20 20  straint==0 ){.  
1b720 20 20 20 20 69 73 45 71 20 3d 20 30 3b 0a 20 20      isEq = 0;.  
1b730 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 43 6f    }else if( (pCo
1b740 6e 73 74 72 61 69 6e 74 2d 3e 65 4f 70 65 72 61  nstraint->eOpera
1b750 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
1b760 29 7b 0a 20 20 20 20 20 20 69 73 45 71 20 3d 20  ){.      isEq = 
1b770 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1b780 20 28 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 65   (pConstraint->e
1b790 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
1b7a0 4e 55 4c 4c 29 21 3d 30 20 29 7b 0a 20 20 20 20  NULL)!=0 ){.    
1b7b0 20 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20    uniqueNotNull 
1b7c0 3d 20 30 3b 0a 20 20 20 20 20 20 69 73 45 71 20  = 0;.      isEq 
1b7d0 3d 20 31 3b 20 20 2f 2a 20 22 58 20 49 53 20 4e  = 1;  /* "X IS N
1b7e0 55 4c 4c 22 20 6d 65 61 6e 73 20 58 20 68 61 73  ULL" means X has
1b7f0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 76   only a single v
1b800 61 6c 75 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  alue */.    }els
1b810 65 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e  e if( pConstrain
1b820 74 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  t->prereqRight==
1b830 30 20 29 7b 0a 20 20 20 20 20 20 69 73 45 71 20  0 ){.      isEq 
1b840 3d 20 31 3b 20 20 2f 2a 20 43 6f 6e 73 74 72 61  = 1;  /* Constra
1b850 69 6e 74 20 22 58 3d 63 6f 6e 73 74 61 6e 74 22  int "X=constant"
1b860 20 6d 65 61 6e 73 20 58 20 68 61 73 20 6f 6e 6c   means X has onl
1b870 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65  y a single value
1b880 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
1b890 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1b8a0 74 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  t = pConstraint-
1b8b0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
1b8c0 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
1b8d0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1b8e0 29 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ){.        WHERE
1b8f0 54 52 41 43 45 28 28 22 20 20 20 20 20 20 20 2e  TRACE(("       .
1b900 2e 20 69 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d  . isOrderedColum
1b910 6e 28 74 61 62 3d 25 64 2c 63 6f 6c 3d 25 64 29  n(tab=%d,col=%d)
1b920 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b930 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69         pRight->i
1b940 54 61 62 6c 65 2c 20 70 52 69 67 68 74 2d 3e 69  Table, pRight->i
1b950 43 6f 6c 75 6d 6e 29 29 3b 0a 20 20 20 20 20 20  Column));.      
1b960 20 20 69 73 45 71 20 3d 20 69 73 4f 72 64 65 72    isEq = isOrder
1b970 65 64 43 6f 6c 75 6d 6e 28 70 2c 20 70 52 69 67  edColumn(p, pRig
1b980 68 74 2d 3e 69 54 61 62 6c 65 2c 20 70 52 69 67  ht->iTable, pRig
1b990 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ht->iColumn);.  
1b9a0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1b9b0 28 28 22 20 2d 3e 20 69 73 45 71 3d 25 64 5c 6e  ((" -> isEq=%d\n
1b9c0 22 2c 20 69 73 45 71 29 29 3b 0a 0a 20 20 20 20  ", isEq));..    
1b9d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
1b9e0 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74  nstraint is of t
1b9f0 68 65 20 66 6f 72 6d 20 58 3d 59 20 77 68 65 72  he form X=Y wher
1ba00 65 20 59 20 69 73 20 61 6e 20 6f 72 64 65 72 65  e Y is an ordere
1ba10 64 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  d value.        
1ba20 2a 2a 20 69 6e 20 61 6e 20 6f 75 74 65 72 20 6c  ** in an outer l
1ba30 6f 6f 70 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  oop, then make s
1ba40 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
1ba50 65 72 20 6f 66 20 59 20 6d 61 74 63 68 65 73 20  er of Y matches 
1ba60 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  the.        ** s
1ba70 6f 72 74 20 6f 72 64 65 72 20 72 65 71 75 69 72  ort order requir
1ba80 65 64 20 66 6f 72 20 58 2e 20 2a 2f 0a 20 20 20  ed for X. */.   
1ba90 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
1baa0 20 26 26 20 69 73 45 71 3e 3d 32 20 26 26 20 69   && isEq>=2 && i
1bab0 73 45 71 21 3d 70 4f 42 49 74 65 6d 2d 3e 73 6f  sEq!=pOBItem->so
1bac0 72 74 4f 72 64 65 72 2b 32 20 29 7b 0a 20 20 20  rtOrder+2 ){.   
1bad0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1bae0 20 69 73 45 71 3d 3d 32 20 29 3b 0a 20 20 20 20   isEq==2 );.    
1baf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bb00 69 73 45 71 3d 3d 33 20 29 3b 0a 20 20 20 20 20  isEq==3 );.     
1bb10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bb20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1bb30 65 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20  e{.        isEq 
1bb40 3d 20 30 3b 20 20 2f 2a 20 22 58 3d 65 78 70 72  = 0;  /* "X=expr
1bb50 22 20 70 6c 61 63 65 73 20 6e 6f 20 6f 72 64 65  " places no orde
1bb60 72 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73  ring constraints
1bb70 20 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20 7d   on X */.      }
1bb80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1bb90 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
1bba0 20 69 66 28 20 69 73 45 71 3d 3d 30 20 29 7b 0a   if( isEq==0 ){.
1bbb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1bbc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bbd0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1bbe0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1bbf0 69 66 28 20 69 73 45 71 21 3d 31 20 29 7b 0a 20  if( isEq!=1 ){. 
1bc00 20 20 20 20 20 69 66 28 20 73 6f 72 74 4f 72 64       if( sortOrd
1bc10 65 72 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20  er==2 ){.       
1bc20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72   sortOrder = ter
1bc30 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  mSortOrder;.    
1bc40 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65 72 6d    }else if( term
1bc50 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f  SortOrder!=sortO
1bc60 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
1bc70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1bc80 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
1bc90 20 20 70 4f 42 49 74 65 6d 2b 2b 3b 0a 20 20 20    pOBItem++;.   
1bca0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29   if( iColumn<0 )
1bcb0 7b 0a 20 20 20 20 20 20 73 65 65 6e 52 6f 77 69  {.      seenRowi
1bcc0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  d = 1;.      bre
1bcd0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ak;.    }else if
1bce0 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ( pTab->aCol[iCo
1bcf0 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
1bd00 20 26 26 20 69 73 45 71 21 3d 31 20 29 7b 0a 20   && isEq!=1 ){. 
1bd10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1bd20 73 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sEq==0 );.      
1bd30 74 65 73 74 63 61 73 65 28 20 69 73 45 71 3d 3d  testcase( isEq==
1bd40 32 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  2 );.      testc
1bd50 61 73 65 28 20 69 73 45 71 3d 3d 33 20 29 3b 0a  ase( isEq==3 );.
1bd60 20 20 20 20 20 20 75 6e 69 71 75 65 4e 6f 74 4e        uniqueNotN
1bd70 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ull = 0;.    }. 
1bd80 20 7d 0a 20 20 69 66 28 20 73 65 65 6e 52 6f 77   }.  if( seenRow
1bd90 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 71 75 65  id ){.    unique
1bda0 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d  NotNull = 1;.  }
1bdb0 65 6c 73 65 20 69 66 28 20 75 6e 69 71 75 65 4e  else if( uniqueN
1bdc0 6f 74 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 69 3c 70  otNull==0 || i<p
1bdd0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
1bde0 20 20 20 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c      uniqueNotNul
1bdf0 6c 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  l = 0;.  }..  /*
1be00 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   If we have not 
1be10 66 6f 75 6e 64 20 61 74 20 6c 65 61 73 74 20 6f  found at least o
1be20 6e 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ne ORDER BY term
1be30 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
1be40 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  e.  ** index, th
1be50 65 6e 20 73 68 6f 77 20 6e 6f 20 70 72 6f 67 72  en show no progr
1be60 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ess. */.  if( pO
1be70 42 49 74 65 6d 3d 3d 26 70 4f 72 64 65 72 42 79  BItem==&pOrderBy
1be80 2d 3e 61 5b 6e 50 72 69 6f 72 53 61 74 5d 20 29  ->a[nPriorSat] )
1be90 20 72 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61   return nPriorSa
1bea0 74 3b 0a 0a 20 20 2f 2a 20 2a 2f 20 20 0a 20 20  t;..  /* */  .  
1beb0 69 66 28 20 6f 75 74 65 72 4f 62 55 6e 69 71 75  if( outerObUniqu
1bec0 65 3d 3d 30 20 26 26 20 75 6e 69 71 75 65 4e 6f  e==0 && uniqueNo
1bed0 74 4e 75 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  tNull==0 ) retur
1bee0 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 2a  n nPriorSat;.  *
1bef0 70 62 4f 62 55 6e 69 71 75 65 20 3d 20 75 6e 69  pbObUnique = uni
1bf00 71 75 65 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f  queNotNull;..  /
1bf10 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 63  * Return the nec
1bf20 65 73 73 61 72 79 20 73 63 61 6e 20 6f 72 64 65  essary scan orde
1bf30 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61  r back to the ca
1bf40 6c 6c 65 72 20 2a 2f 0a 20 20 2a 70 62 52 65 76  ller */.  *pbRev
1bf50 20 3d 20 73 6f 72 74 4f 72 64 65 72 20 26 20 31   = sortOrder & 1
1bf60 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
1bf70 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 42   was an "ORDER B
1bf80 59 20 72 6f 77 69 64 22 20 74 65 72 6d 20 74 68  Y rowid" term th
1bf90 61 74 20 6d 61 74 63 68 65 64 2c 20 6f 72 20 69  at matched, or i
1bfa0 74 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70  t is only.  ** p
1bfb0 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 73 69  ossible for a si
1bfc0 6e 67 6c 65 20 72 6f 77 20 66 72 6f 6d 20 74 68  ngle row from th
1bfd0 69 73 20 74 61 62 6c 65 20 74 6f 20 6d 61 74 63  is table to matc
1bfe0 68 2c 20 74 68 65 6e 20 73 6b 69 70 20 6f 76 65  h, then skip ove
1bff0 72 0a 20 20 2a 2a 20 61 6e 79 20 61 64 64 69 74  r.  ** any addit
1c000 69 6f 6e 61 6c 20 4f 52 44 45 52 20 42 59 20 74  ional ORDER BY t
1c010 65 72 6d 73 20 64 65 61 6c 69 6e 67 20 77 69 74  erms dealing wit
1c020 68 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 20 20  h this table..  
1c030 2a 2f 0a 20 20 69 66 28 20 75 6e 69 71 75 65 4e  */.  if( uniqueN
1c040 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2f 2a  otNull ){.    /*
1c050 20 41 64 76 61 6e 63 65 20 6a 20 6f 76 65 72 20   Advance j over 
1c060 61 64 64 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52  additional ORDER
1c070 20 42 59 20 74 65 72 6d 73 20 61 73 73 6f 63 69   BY terms associ
1c080 61 74 65 64 20 77 69 74 68 20 62 61 73 65 20 2a  ated with base *
1c090 2f 0a 20 20 20 20 57 68 65 72 65 4d 61 73 6b 53  /.    WhereMaskS
1c0a0 65 74 20 2a 70 4d 53 20 3d 20 70 2d 3e 70 57 43  et *pMS = p->pWC
1c0b0 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20  ->pMaskSet;.    
1c0c0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 7e 67 65 74  Bitmask m = ~get
1c0d0 4d 61 73 6b 28 70 4d 53 2c 20 62 61 73 65 29 3b  Mask(pMS, base);
1c0e0 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 6e 54  .    while( j<nT
1c0f0 65 72 6d 20 26 26 20 28 65 78 70 72 54 61 62 6c  erm && (exprTabl
1c100 65 55 73 61 67 65 28 70 4d 53 2c 20 70 4f 72 64  eUsage(pMS, pOrd
1c110 65 72 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  erBy->a[j].pExpr
1c120 29 26 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  )&m)==0 ){.     
1c130 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1c140 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
1c150 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65  *.** Find the be
1c160 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f  st query plan fo
1c170 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61  r accessing a pa
1c180 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20  rticular table. 
1c190 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65   Write the.** be
1c1a0 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e  st query plan an
1c1b0 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20  d its cost into 
1c1c0 74 68 65 20 70 2d 3e 63 6f 73 74 2e 0a 2a 2a 0a  the p->cost..**.
1c1d0 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f  ** The lowest co
1c1e0 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54  st plan wins.  T
1c1f0 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73  he cost is an es
1c200 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d  timate of the am
1c210 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61  ount of.** CPU a
1c220 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64  nd disk I/O need
1c230 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
1c240 65 20 72 65 71 75 65 73 74 65 64 20 72 65 73 75  e requested resu
1c250 6c 74 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74  lt..** Factors t
1c260 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f  hat influence co
1c270 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  st include:.**.*
1c280 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69  *    *  The esti
1c290 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
1c2a0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
1c2b0 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54  e retrieved.  (T
1c2c0 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65  he.**       fewe
1c2d0 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a  r the better.).*
1c2e0 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
1c2f0 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e  er or not sortin
1c300 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a  g must occur..**
1c310 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
1c320 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d  r or not there m
1c330 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20  ust be separate 
1c340 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a  lookups in the.*
1c350 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e  *       index an
1c360 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  d in the main ta
1c370 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
1c380 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
1c390 45 44 20 42 59 20 63 6c 61 75 73 65 20 28 70 53  ED BY clause (pS
1c3a0 72 63 2d 3e 70 49 6e 64 65 78 29 20 61 74 74 61  rc->pIndex) atta
1c3b0 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  ched to the tabl
1c3c0 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  e in.** the SQL 
1c3d0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
1c3e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  this function on
1c3f0 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61  ly considers pla
1c400 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ns using the .**
1c410 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66   named index. If
1c420 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20 69 73   no such plan is
1c430 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
1c440 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69   returned cost i
1c450 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f  s.** SQLITE_BIG_
1c460 44 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 69  DBL. If a plan i
1c470 73 20 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65  s found that use
1c480 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  s the named inde
1c490 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  x, .** then the 
1c4a0 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74  cost is calculat
1c4b0 65 64 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20  ed in the usual 
1c4c0 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  way..**.** If a 
1c4d0 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
1c4e0 73 65 20 77 61 73 20 61 74 74 61 63 68 65 64 20  se was attached 
1c4f0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  to the table .**
1c500 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
1c510 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e  tatement, then n
1c520 6f 20 69 6e 64 65 78 65 73 20 61 72 65 20 63 6f  o indexes are co
1c530 6e 73 69 64 65 72 65 64 2e 20 48 6f 77 65 76 65  nsidered. Howeve
1c540 72 2c 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65 63  r, the .** selec
1c550 74 65 64 20 70 6c 61 6e 20 6d 61 79 20 73 74 69  ted plan may sti
1c560 6c 6c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  ll take advantag
1c570 65 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  e of the built-i
1c580 6e 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  n rowid primary 
1c590 6b 65 79 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f  key.** index..*/
1c5a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
1c5b0 74 42 74 72 65 65 49 6e 64 65 78 28 57 68 65 72  tBtreeIndex(Wher
1c5c0 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20 20  eBestIdx *p){.  
1c5d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1c5e0 70 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20 54  p->pParse;  /* T
1c5f0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1c600 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
1c610 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57  use *pWC = p->pW
1c620 43 3b 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45  C;  /* The WHERE
1c630 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1c640 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1c650 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
1c660 3b 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c  ; /* The FROM cl
1c670 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
1c680 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  rch */.  int iCu
1c690 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  r = pSrc->iCurso
1c6a0 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
1c6b0 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
1c6c0 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a  to be accessed *
1c6d0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
1c6e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1c6f0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
1c700 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
1c710 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c730 2a 20 43 6f 70 79 20 6f 66 20 70 50 72 6f 62 65  * Copy of pProbe
1c740 2c 20 6f 72 20 7a 65 72 6f 20 66 6f 72 20 49 50  , or zero for IP
1c750 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  K index */.  int
1c760 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20   eqTermMask;    
1c770 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1c780 65 6e 74 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69  ent mask of vali
1c790 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61  d equality opera
1c7a0 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64  tors */.  int id
1c7b0 78 45 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20  xEqTermMask;    
1c7c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6d        /* Index m
1c7d0 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75  ask of valid equ
1c7e0 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20  ality operators 
1c7f0 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
1c820 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
1c830 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
1c840 20 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73   tRowcnt aiRowEs
1c850 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20  tPk[2];      /* 
1c860 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76  The aiRowEst[] v
1c870 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
1c880 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
1c890 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
1c8a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
1c8b0 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
1c8c0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
1c8d0 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67   */.  int wsFlag
1c8e0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1c8f0 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 66 6c 61    /* Allowed fla
1c900 67 73 20 69 6e 20 70 2d 3e 63 6f 73 74 2e 70 6c  gs in p->cost.pl
1c910 61 6e 2e 77 73 46 6c 61 67 20 2a 2f 0a 20 20 69  an.wsFlag */.  i
1c920 6e 74 20 6e 50 72 69 6f 72 53 61 74 3b 20 20 20  nt nPriorSat;   
1c930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52             /* OR
1c940 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
1c950 69 73 66 69 65 64 20 62 79 20 6f 75 74 65 72 20  isfied by outer 
1c960 6c 6f 6f 70 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  loops */.  int n
1c970 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
1c980 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c990 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
1c9a0 6d 73 20 2a 2f 0a 20 20 63 68 61 72 20 62 53 6f  ms */.  char bSo
1c9b0 72 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  rtInit;         
1c9c0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1c9d0 65 72 20 66 6f 72 20 62 53 6f 72 74 20 69 6e 20  er for bSort in 
1c9e0 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20  inner loop */.  
1c9f0 63 68 61 72 20 62 44 69 73 74 49 6e 69 74 3b 20  char bDistInit; 
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1ca10 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 62  nitializer for b
1ca20 44 69 73 74 20 69 6e 20 69 6e 6e 65 72 20 6c 6f  Dist in inner lo
1ca30 6f 70 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 49 6e 69  op */...  /* Ini
1ca40 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 73 74  tialize the cost
1ca50 20 74 6f 20 61 20 77 6f 72 73 74 2d 63 61 73 65   to a worst-case
1ca60 20 76 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73   value */.  mems
1ca70 65 74 28 26 70 2d 3e 63 6f 73 74 2c 20 30 2c 20  et(&p->cost, 0, 
1ca80 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 73 74 29 29  sizeof(p->cost))
1ca90 3b 0a 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73  ;.  p->cost.rCos
1caa0 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
1cab0 42 4c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  BL;..  /* If the
1cac0 20 70 53 72 63 20 74 61 62 6c 65 20 69 73 20 74   pSrc table is t
1cad0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
1cae0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68  f a LEFT JOIN th
1caf0 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20  en we may not.  
1cb00 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20  ** use an index 
1cb10 74 6f 20 73 61 74 69 73 66 79 20 49 53 20 4e 55  to satisfy IS NU
1cb20 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
1cb30 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20 54  n that table.  T
1cb40 68 69 73 20 69 73 0a 20 20 2a 2a 20 62 65 63 61  his is.  ** beca
1cb50 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68  use columns migh
1cb60 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 4e  t end up being N
1cb70 55 4c 4c 20 69 66 20 74 68 65 20 74 61 62 6c 65  ULL if the table
1cb80 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
1cb90 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63 75 6d 73  -.  ** a circums
1cba0 74 61 6e 63 65 20 77 68 69 63 68 20 74 68 65 20  tance which the 
1cbb0 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c  index cannot hel
1cbc0 70 20 75 73 20 64 69 73 63 6f 76 65 72 2e 20 20  p us discover.  
1cbd0 54 69 63 6b 65 74 20 23 32 31 37 37 2e 0a 20 20  Ticket #2177..  
1cbe0 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6a  */.  if( pSrc->j
1cbf0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
1cc00 54 20 29 7b 0a 20 20 20 20 69 64 78 45 71 54 65  T ){.    idxEqTe
1cc10 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
1cc20 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_IN;.  }else{. 
1cc30 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b     idxEqTermMask
1cc40 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
1cc50 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20  O_ISNULL;.  }.. 
1cc60 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
1cc70 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
1cc80 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1cc90 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
1cca0 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
1ccb0 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 49 64 78   use */.    pIdx
1ccc0 20 3d 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63   = pProbe = pSrc
1ccd0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 73  ->pIndex;.    ws
1cce0 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45  FlagMask = ~(WHE
1ccf0 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
1cd00 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a  E_ROWID_RANGE);.
1cd10 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d      eqTermMask =
1cd20 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a   idxEqTermMask;.
1cd30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1cd40 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45  There is no INDE
1cd50 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20  XED BY clause.  
1cd60 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e  Create a fake In
1cd70 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f  dex object in lo
1cd80 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  cal.    ** varia
1cd90 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65  ble sPk to repre
1cda0 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70  sent the rowid p
1cdb0 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
1cdc0 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20  .  Make this.   
1cdd0 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74   ** fake index t
1cde0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68  he first in a ch
1cdf0 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a  ain of Index obj
1ce00 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66  ects with all of
1ce10 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a   the real.    **
1ce20 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c   indices to foll
1ce30 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ow */.    Index 
1ce40 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
1ce50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1ce60 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63  st of real indic
1ce70 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  es on the table 
1ce80 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
1ce90 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e  Pk, 0, sizeof(In
1cea0 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e  dex));.    sPk.n
1ceb0 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
1cec0 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26  sPk.aiColumn = &
1ced0 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20  aiColumnPk;.    
1cee0 73 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61  sPk.aiRowEst = a
1cef0 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73  iRowEstPk;.    s
1cf00 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  Pk.onError = OE_
1cf10 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b  Replace;.    sPk
1cf20 2e 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e  .pTable = pSrc->
1cf30 70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45  pTab;.    aiRowE
1cf40 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e  stPk[0] = pSrc->
1cf50 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20  pTab->nRowEst;. 
1cf60 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d     aiRowEstPk[1]
1cf70 20 3d 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74   = 1;.    pFirst
1cf80 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70   = pSrc->pTab->p
1cf90 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
1cfa0 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d  Src->notIndexed=
1cfb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1cfc0 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  he real indices 
1cfd0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  of the table are
1cfe0 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64   only considered
1cff0 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   if the.      **
1d000 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61   NOT INDEXED qua
1d010 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65  lifier is omitte
1d020 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20  d from the FROM 
1d030 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
1d040 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72  sPk.pNext = pFir
1d050 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  st;.    }.    pP
1d060 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 20  robe = &sPk;.   
1d070 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28   wsFlagMask = ~(
1d080 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 43  .        WHERE_C
1d090 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43  OLUMN_IN|WHERE_C
1d0a0 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43  OLUMN_EQ|WHERE_C
1d0b0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45  OLUMN_NULL|WHERE
1d0c0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 0a 20 20  _COLUMN_RANGE.  
1d0d0 20 20 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d    );.    eqTermM
1d0e0 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
1d0f0 4e 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b  N;.    pIdx = 0;
1d100 0a 20 20 7d 0a 0a 20 20 6e 4f 72 64 65 72 42 79  .  }..  nOrderBy
1d110 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3f   = p->pOrderBy ?
1d120 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45   p->pOrderBy->nE
1d130 78 70 72 20 3a 20 30 3b 0a 20 20 69 66 28 20 70  xpr : 0;.  if( p
1d140 2d 3e 69 20 29 7b 0a 20 20 20 20 6e 50 72 69 6f  ->i ){.    nPrio
1d150 72 53 61 74 20 3d 20 70 2d 3e 61 4c 65 76 65 6c  rSat = p->aLevel
1d160 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f  [p->i-1].plan.nO
1d170 42 53 61 74 3b 0a 20 20 20 20 62 53 6f 72 74 49  BSat;.    bSortI
1d180 6e 69 74 20 3d 20 6e 50 72 69 6f 72 53 61 74 3c  nit = nPriorSat<
1d190 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 62 44  nOrderBy;.    bD
1d1a0 69 73 74 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  istInit = 0;.  }
1d1b0 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 69 6f 72  else{.    nPrior
1d1c0 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 62 53 6f  Sat = 0;.    bSo
1d1d0 72 74 49 6e 69 74 20 3d 20 6e 4f 72 64 65 72 42  rtInit = nOrderB
1d1e0 79 3e 30 3b 0a 20 20 20 20 62 44 69 73 74 49 6e  y>0;.    bDistIn
1d1f0 69 74 20 3d 20 70 2d 3e 70 44 69 73 74 69 6e 63  it = p->pDistinc
1d200 74 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  t!=0;.  }..  /* 
1d210 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
1d220 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  dices looking fo
1d230 72 20 74 68 65 20 62 65 73 74 20 6f 6e 65 20 74  r the best one t
1d240 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  o use.  */.  for
1d250 28 3b 20 70 50 72 6f 62 65 3b 20 70 49 64 78 3d  (; pProbe; pIdx=
1d260 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
1d270 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Next){.    const
1d280 20 74 52 6f 77 63 6e 74 20 2a 20 63 6f 6e 73 74   tRowcnt * const
1d290 20 61 69 52 6f 77 45 73 74 20 3d 20 70 50 72 6f   aiRowEst = pPro
1d2a0 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20  be->aiRowEst;.  
1d2b0 20 20 57 68 65 72 65 43 6f 73 74 20 70 63 3b 20    WhereCost pc; 
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d2d0 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 70   Cost of using p
1d2e0 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20 64 6f 75  Probe */.    dou
1d2f0 62 6c 65 20 6c 6f 67 31 30 4e 20 3d 20 28 64 6f  ble log10N = (do
1d300 75 62 6c 65 29 31 3b 20 20 2f 2a 20 62 61 73 65  uble)1;  /* base
1d310 2d 31 30 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  -10 logarithm of
1d320 20 6e 52 6f 77 20 28 69 6e 65 78 61 63 74 29 20   nRow (inexact) 
1d330 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  */..    /* The f
1d340 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
1d350 65 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64  es are populated
1d360 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70 72   based on the pr
1d370 6f 70 65 72 74 69 65 73 20 6f 66 0a 20 20 20 20  operties of.    
1d380 2a 2a 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65  ** index being e
1d390 76 61 6c 75 61 74 65 64 2e 20 54 68 65 79 20 61  valuated. They a
1d3a0 72 65 20 74 68 65 6e 20 75 73 65 64 20 74 6f 20  re then used to 
1d3b0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65 78  determine the ex
1d3c0 70 65 63 74 65 64 0a 20 20 20 20 2a 2a 20 63 6f  pected.    ** co
1d3d0 73 74 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  st and number of
1d3e0 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 2e 0a   rows returned..
1d3f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 70      **.    **  p
1d400 63 2e 70 6c 61 6e 2e 6e 45 71 3a 20 0a 20 20 20  c.plan.nEq: .   
1d410 20 2a 2a 20 20 20 20 4e 75 6d 62 65 72 20 6f 66   **    Number of
1d420 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20   equality terms 
1d430 74 68 61 74 20 63 61 6e 20 62 65 20 69 6d 70 6c  that can be impl
1d440 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68  emented using th
1d450 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20  e index..    ** 
1d460 20 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64     In other word
1d470 73 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  s, the number of
1d480 20 69 6e 69 74 69 61 6c 20 66 69 65 6c 64 73 20   initial fields 
1d490 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  in the index tha
1d4a0 74 0a 20 20 20 20 2a 2a 20 20 20 20 61 72 65 20  t.    **    are 
1d4b0 75 73 65 64 20 69 6e 20 3d 3d 20 6f 72 20 49 4e  used in == or IN
1d4c0 20 6f 72 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   or NOT NULL con
1d4d0 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20  straints of the 
1d4e0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
1d4f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 49 6e    **.    **  nIn
1d500 4d 75 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20  Mul:  .    **   
1d510 20 54 68 65 20 22 69 6e 2d 6d 75 6c 74 69 70 6c   The "in-multipl
1d520 69 65 72 22 2e 20 54 68 69 73 20 69 73 20 61 6e  ier". This is an
1d530 20 65 73 74 69 6d 61 74 65 20 6f 66 20 68 6f 77   estimate of how
1d540 20 6d 61 6e 79 20 73 65 65 6b 20 6f 70 65 72 61   many seek opera
1d550 74 69 6f 6e 73 20 0a 20 20 20 20 2a 2a 20 20 20  tions .    **   
1d560 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72   SQLite must per
1d570 66 6f 72 6d 20 6f 6e 20 74 68 65 20 69 6e 64 65  form on the inde
1d580 78 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 46  x in question. F
1d590 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1d5a0 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 57 48  he .    **    WH
1d5b0 45 52 45 20 63 6c 61 75 73 65 20 69 73 3a 0a 20  ERE clause is:. 
1d5c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1d5d0 20 20 57 48 45 52 45 20 61 20 49 4e 20 28 31 2c    WHERE a IN (1,
1d5e0 20 32 2c 20 33 29 20 41 4e 44 20 62 20 49 4e 20   2, 3) AND b IN 
1d5f0 28 34 2c 20 35 2c 20 36 29 0a 20 20 20 20 2a 2a  (4, 5, 6).    **
1d600 0a 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74  .    **    SQLit
1d610 65 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 39  e must perform 9
1d620 20 6c 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 69   lookups on an i
1d630 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20  ndex on (a, b), 
1d640 73 6f 20 6e 49 6e 4d 75 6c 20 69 73 20 0a 20 20  so nInMul is .  
1d650 20 20 2a 2a 20 20 20 20 73 65 74 20 74 6f 20 39    **    set to 9
1d660 2e 20 47 69 76 65 6e 20 74 68 65 20 73 61 6d 65  . Given the same
1d670 20 73 63 68 65 6d 61 20 61 6e 64 20 65 69 74 68   schema and eith
1d680 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  er of the follow
1d690 69 6e 67 20 57 48 45 52 45 20 0a 20 20 20 20 2a  ing WHERE .    *
1d6a0 2a 20 20 20 20 63 6c 61 75 73 65 73 3a 0a 20 20  *    clauses:.  
1d6b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1d6c0 20 57 48 45 52 45 20 61 20 3d 20 20 31 0a 20 20   WHERE a =  1.  
1d6d0 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20    **      WHERE 
1d6e0 61 20 3e 3d 20 32 0a 20 20 20 20 2a 2a 0a 20 20  a >= 2.    **.  
1d6f0 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69    **    nInMul i
1d700 73 20 73 65 74 20 74 6f 20 31 2e 0a 20 20 20 20  s set to 1..    
1d710 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 49 66 20  **.    **    If 
1d720 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 57  there exists a W
1d730 48 45 52 45 20 74 65 72 6d 20 6f 66 20 74 68 65  HERE term of the
1d740 20 66 6f 72 6d 20 22 78 20 49 4e 20 28 53 45 4c   form "x IN (SEL
1d750 45 43 54 20 2e 2e 2e 29 22 2c 20 74 68 65 6e 20  ECT ...)", then 
1d760 0a 20 20 20 20 2a 2a 20 20 20 20 74 68 65 20 73  .    **    the s
1d770 75 62 2d 73 65 6c 65 63 74 20 69 73 20 61 73 73  ub-select is ass
1d780 75 6d 65 64 20 74 6f 20 72 65 74 75 72 6e 20 32  umed to return 2
1d790 35 20 72 6f 77 73 20 66 6f 72 20 74 68 65 20 70  5 rows for the p
1d7a0 75 72 70 6f 73 65 73 20 6f 66 20 0a 20 20 20 20  urposes of .    
1d7b0 2a 2a 20 20 20 20 64 65 74 65 72 6d 69 6e 69 6e  **    determinin
1d7c0 67 20 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a  g nInMul..    **
1d7d0 0a 20 20 20 20 2a 2a 20 20 62 49 6e 45 73 74 3a  .    **  bInEst:
1d7e0 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 65 74    .    **    Set
1d7f0 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 72   to true if ther
1d800 65 20 77 61 73 20 61 74 20 6c 65 61 73 74 20 6f  e was at least o
1d810 6e 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  ne "x IN (SELECT
1d820 20 2e 2e 2e 29 22 20 74 65 72 6d 20 75 73 65 64   ...)" term used
1d830 20 0a 20 20 20 20 2a 2a 20 20 20 20 69 6e 20 64   .    **    in d
1d840 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 76  etermining the v
1d850 61 6c 75 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e 20  alue of nInMul. 
1d860 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 52   Note that the R
1d870 48 53 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  HS of the.    **
1d880 20 20 20 20 49 4e 20 6f 70 65 72 61 74 6f 72 20      IN operator 
1d890 6d 75 73 74 20 62 65 20 61 20 53 45 4c 45 43 54  must be a SELECT
1d8a0 2c 20 6e 6f 74 20 61 20 76 61 6c 75 65 20 6c 69  , not a value li
1d8b0 73 74 2c 20 66 6f 72 20 74 68 69 73 20 76 61 72  st, for this var
1d8c0 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20  iable.    **    
1d8d0 74 6f 20 62 65 20 74 72 75 65 2e 0a 20 20 20 20  to be true..    
1d8e0 2a 2a 0a 20 20 20 20 2a 2a 20 20 72 61 6e 67 65  **.    **  range
1d8f0 44 69 76 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41  Div:.    **    A
1d900 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 61 20  n estimate of a 
1d910 64 69 76 69 73 6f 72 20 62 79 20 77 68 69 63 68  divisor by which
1d920 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73   to reduce the s
1d930 65 61 72 63 68 20 73 70 61 63 65 20 64 75 65 0a  earch space due.
1d940 20 20 20 20 2a 2a 20 20 20 20 74 6f 20 69 6e 65      **    to ine
1d950 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1d960 6e 74 73 2e 20 20 49 6e 20 74 68 65 20 61 62 73  nts.  In the abs
1d970 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73  ence of sqlite_s
1d980 74 61 74 33 20 41 4e 41 4c 59 5a 45 0a 20 20 20  tat3 ANALYZE.   
1d990 20 2a 2a 20 20 20 20 64 61 74 61 2c 20 61 20 73   **    data, a s
1d9a0 69 6e 67 6c 65 20 69 6e 65 71 75 61 6c 69 74 79  ingle inequality
1d9b0 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
1d9c0 72 63 68 20 73 70 61 63 65 20 74 6f 20 31 2f 34  rch space to 1/4
1d9d0 72 64 20 69 74 73 0a 20 20 20 20 2a 2a 20 20 20  rd its.    **   
1d9e0 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 28   original size (
1d9f0 72 61 6e 67 65 44 69 76 3d 3d 34 29 2e 20 20 54  rangeDiv==4).  T
1da00 77 6f 20 69 6e 65 71 75 61 6c 69 74 69 65 73 20  wo inequalities 
1da10 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
1da20 68 0a 20 20 20 20 2a 2a 20 20 20 20 73 70 61 63  h.    **    spac
1da30 65 20 74 6f 20 31 2f 31 36 74 68 20 6f 66 20 69  e to 1/16th of i
1da40 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1da50 20 28 72 61 6e 67 65 44 69 76 3d 3d 31 36 29 2e   (rangeDiv==16).
1da60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1da70 62 53 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a 2a  bSort:   .    **
1da80 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75      Boolean. Tru
1da90 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
1daa0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1dab0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69   that will requi
1dac0 72 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20  re an .    **   
1dad0 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 28   external sort (
1dae0 69 2e 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74 68  i.e. scanning th
1daf0 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76  e index being ev
1db00 61 6c 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f 74  aluated will not
1db10 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 72 72   .    **    corr
1db20 65 63 74 6c 79 20 6f 72 64 65 72 20 72 65 63 6f  ectly order reco
1db30 72 64 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rds)..    **.   
1db40 20 2a 2a 20 20 62 44 69 73 74 3a 0a 20 20 20 20   **  bDist:.    
1db50 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54  **    Boolean. T
1db60 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20  rue if there is 
1db70 61 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73  a DISTINCT claus
1db80 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75  e that will requ
1db90 69 72 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20  ire an .    **  
1dba0 20 20 65 78 74 65 72 6e 61 6c 20 62 74 72 65 65    external btree
1dbb0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1dbc0 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a   bLookup: .    *
1dbd0 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72  *    Boolean. Tr
1dbe0 75 65 20 69 66 20 61 20 74 61 62 6c 65 20 6c 6f  ue if a table lo
1dbf0 6f 6b 75 70 20 69 73 20 72 65 71 75 69 72 65 64  okup is required
1dc00 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
1dc10 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 20 20 20  entry.    **    
1dc20 76 69 73 69 74 65 64 2e 20 20 49 6e 20 6f 74 68  visited.  In oth
1dc30 65 72 20 77 6f 72 64 73 2c 20 74 72 75 65 20 69  er words, true i
1dc40 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
1dc50 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
1dc60 20 20 20 20 2a 2a 20 20 20 20 54 68 69 73 20 69      **    This i
1dc70 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 66  s always false f
1dc80 6f 72 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  or the rowid pri
1dc90 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 6f  mary key index o
1dca0 66 20 61 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  f a table..    *
1dcb0 2a 20 20 20 20 46 6f 72 20 6f 74 68 65 72 20 69  *    For other i
1dcc0 6e 64 65 78 65 73 2c 20 69 74 20 69 73 20 74 72  ndexes, it is tr
1dcd0 75 65 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68  ue unless all th
1dce0 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
1dcf0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20   table.    **   
1dd00 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45 4c   used by the SEL
1dd10 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ECT statement ar
1dd20 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
1dd30 20 69 6e 64 65 78 20 28 73 75 63 68 20 61 6e 0a   index (such an.
1dd40 20 20 20 20 2a 2a 20 20 20 20 69 6e 64 65 78 20      **    index 
1dd50 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 64 65 73  is sometimes des
1dd60 63 72 69 62 65 64 20 61 73 20 61 20 63 6f 76 65  cribed as a cove
1dd70 72 69 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20 20  ring index)..   
1dd80 20 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70   **    For examp
1dd90 6c 65 2c 20 67 69 76 65 6e 20 74 68 65 20 69 6e  le, given the in
1dda0 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
1ddb0 68 65 20 73 65 63 6f 6e 64 20 6f 66 20 74 68 65  he second of the
1ddc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20   following .    
1ddd0 2a 2a 20 20 20 20 74 77 6f 20 71 75 65 72 69 65  **    two querie
1dde0 73 20 72 65 71 75 69 72 65 73 20 74 61 62 6c 65  s requires table
1ddf0 20 62 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20   b-tree lookups 
1de00 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6e 64  in order to find
1de10 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a   the value.    *
1de20 2a 20 20 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63  *    of column c
1de30 2c 20 62 75 74 20 74 68 65 20 66 69 72 73 74 20  , but the first 
1de40 64 6f 65 73 20 6e 6f 74 20 62 65 63 61 75 73 65  does not because
1de50 20 63 6f 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62   columns a and b
1de60 20 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 62   are.    **    b
1de70 6f 74 68 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  oth available in
1de80 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1de90 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1dea0 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20        SELECT a, 
1deb0 62 20 20 20 20 46 52 4f 4d 20 74 62 6c 20 57 48  b    FROM tbl WH
1dec0 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a  ERE a = 1;.    *
1ded0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45  *             SE
1dee0 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  LECT a, b, c FRO
1def0 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20  M tbl WHERE a = 
1df00 31 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  1;.    */.    in
1df10 74 20 62 49 6e 45 73 74 20 3d 20 30 3b 20 20 20  t bInEst = 0;   
1df20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1df30 72 75 65 20 69 66 20 22 78 20 49 4e 20 28 53 45  rue if "x IN (SE
1df40 4c 45 43 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a  LECT...)" seen *
1df50 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c  /.    int nInMul
1df60 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1df70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1df80 20 64 69 73 74 69 6e 63 74 20 65 71 75 61 6c 69   distinct equali
1df90 74 69 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a  ties to lookup *
1dfa0 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 61 6e  /.    double ran
1dfb0 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29  geDiv = (double)
1dfc0 31 3b 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64  1;  /* Estimated
1dfd0 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 73 65   reduction in se
1dfe0 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 20 20  arch space */.  
1dff0 20 20 69 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30    int nBound = 0
1e000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e010 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e  /* Number of ran
1e020 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73  ge constraints s
1e030 65 65 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  een */.    char 
1e040 62 53 6f 72 74 20 3d 20 62 53 6f 72 74 49 6e 69  bSort = bSortIni
1e050 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  t;       /* True
1e060 20 69 66 20 65 78 74 65 72 6e 61 6c 20 73 6f 72   if external sor
1e070 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
1e080 20 20 63 68 61 72 20 62 44 69 73 74 20 3d 20 62    char bDist = b
1e090 44 69 73 74 49 6e 69 74 3b 20 20 20 20 20 20 20  DistInit;       
1e0a0 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 64 65 78  /* True if index
1e0b0 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 77 69 74   cannot help wit
1e0c0 68 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  h DISTINCT */.  
1e0d0 20 20 63 68 61 72 20 62 4c 6f 6f 6b 75 70 20 3d    char bLookup =
1e0e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e0f0 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 74 20 61  /* True if not a
1e100 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
1e110 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1e120 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1e130 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1e140 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1e150 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66  RE clause */.#if
1e160 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1e170 45 5f 53 54 41 54 33 0a 20 20 20 20 57 68 65 72  E_STAT3.    Wher
1e180 65 54 65 72 6d 20 2a 70 46 69 72 73 74 54 65 72  eTerm *pFirstTer
1e190 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69 72  m = 0;    /* Fir
1e1a0 73 74 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67  st term matching
1e1b0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65   the index */.#e
1e1c0 6e 64 69 66 0a 0a 20 20 20 20 57 48 45 52 45 54  ndif..    WHERET
1e1d0 52 41 43 45 28 28 0a 20 20 20 20 20 20 22 20 20  RACE((.      "  
1e1e0 20 25 73 28 25 73 29 3a 5c 6e 22 2c 0a 20 20 20   %s(%s):\n",.   
1e1f0 20 20 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a     pSrc->pTab->z
1e200 4e 61 6d 65 2c 20 28 70 49 64 78 20 3f 20 70 49  Name, (pIdx ? pI
1e210 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b  dx->zName : "ipk
1e220 22 29 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 6d  ").    ));.    m
1e230 65 6d 73 65 74 28 26 70 63 2c 20 30 2c 20 73 69  emset(&pc, 0, si
1e240 7a 65 6f 66 28 70 63 29 29 3b 0a 20 20 20 20 70  zeof(pc));.    p
1e250 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20  c.plan.nOBSat = 
1e260 6e 50 72 69 6f 72 53 61 74 3b 0a 0a 20 20 20 20  nPriorSat;..    
1e270 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
1e280 20 76 61 6c 75 65 73 20 6f 66 20 70 63 2e 70 6c   values of pc.pl
1e290 61 6e 2e 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75  an.nEq and nInMu
1e2a0 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 63 2e  l */.    for(pc.
1e2b0 70 6c 61 6e 2e 6e 45 71 3d 30 3b 20 70 63 2e 70  plan.nEq=0; pc.p
1e2c0 6c 61 6e 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  lan.nEq<pProbe->
1e2d0 6e 43 6f 6c 75 6d 6e 3b 20 70 63 2e 70 6c 61 6e  nColumn; pc.plan
1e2e0 2e 6e 45 71 2b 2b 29 7b 0a 20 20 20 20 20 20 69  .nEq++){.      i
1e2f0 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
1e300 69 43 6f 6c 75 6d 6e 5b 70 63 2e 70 6c 61 6e 2e  iColumn[pc.plan.
1e310 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  nEq];.      pTer
1e320 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
1e330 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f  , iCur, j, p->no
1e340 74 52 65 61 64 79 2c 20 65 71 54 65 72 6d 4d 61  tReady, eqTermMa
1e350 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  sk, pIdx);.     
1e360 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
1e370 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 2e  break;.      pc.
1e380 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
1e390 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  (WHERE_COLUMN_EQ
1e3a0 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29  |WHERE_ROWID_EQ)
1e3b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e3c0 28 20 70 54 65 72 6d 2d 3e 70 57 43 21 3d 70 57  ( pTerm->pWC!=pW
1e3d0 43 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  C );.      if( p
1e3e0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1e3f0 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
1e400 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
1e410 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
1e420 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77         pc.plan.w
1e430 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
1e440 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
1e450 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1e460 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e470 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1e480 20 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49           /* "x I
1e490 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
1e4a0 20 20 41 73 73 75 6d 65 20 74 68 65 20 53 45 4c    Assume the SEL
1e4b0 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72  ECT returns 25 r
1e4c0 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ows */.         
1e4d0 20 6e 49 6e 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20   nInMul *= 25;. 
1e4e0 20 20 20 20 20 20 20 20 20 62 49 6e 45 73 74 20           bInEst 
1e4f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
1e500 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
1e510 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20  xpr->x.pList && 
1e520 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1e530 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
1e540 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
1e550 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
1e560 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e  " */.          n
1e570 49 6e 4d 75 6c 20 2a 3d 20 70 45 78 70 72 2d 3e  InMul *= pExpr->
1e580 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  x.pList->nExpr;.
1e590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e5a0 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
1e5b0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e5c0 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
1e5d0 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
1e5e0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
1e5f0 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  N_NULL;.      }.
1e600 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1e610 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 20  ABLE_STAT3.     
1e620 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 45 71   if( pc.plan.nEq
1e630 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61  ==0 && pProbe->a
1e640 53 61 6d 70 6c 65 20 29 20 70 46 69 72 73 74 54  Sample ) pFirstT
1e650 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 23 65 6e  erm = pTerm;.#en
1e660 64 69 66 0a 20 20 20 20 20 20 70 63 2e 75 73 65  dif.      pc.use
1e670 64 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  d |= pTerm->prer
1e680 65 71 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20  eqRight;.    }. 
1e690 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
1e6a0 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69  ndex being consi
1e6b0 64 65 72 65 64 20 69 73 20 55 4e 49 51 55 45 2c  dered is UNIQUE,
1e6c0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
1e6d0 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a   equality .    *
1e6e0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72  * constraint for
1e6f0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
1e700 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  the index, then 
1e710 74 68 69 73 20 73 65 61 72 63 68 20 77 69 6c 6c  this search will
1e720 20 66 69 6e 64 0a 20 20 20 20 2a 2a 20 61 74 20   find.    ** at 
1e730 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65 20 72 6f  most a single ro
1e740 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  w. In this case 
1e750 73 65 74 20 74 68 65 20 57 48 45 52 45 5f 55 4e  set the WHERE_UN
1e760 49 51 55 45 20 66 6c 61 67 20 74 6f 20 0a 20 20  IQUE flag to .  
1e770 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68    ** indicate th
1e780 69 73 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  is to the caller
1e790 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1e7a0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1e7b0 65 20 73 65 61 72 63 68 20 6d 61 79 20 66 69 6e  e search may fin
1e7c0 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  d more than one 
1e7d0 72 6f 77 2c 20 74 65 73 74 20 74 6f 20 73 65 65  row, test to see
1e7e0 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 72 65   if.    ** there
1e7f0 20 69 73 20 61 20 72 61 6e 67 65 20 63 6f 6e 73   is a range cons
1e800 74 72 61 69 6e 74 20 6f 6e 20 69 6e 64 65 78 65  traint on indexe
1e810 64 20 63 6f 6c 75 6d 6e 20 28 70 63 2e 70 6c 61  d column (pc.pla
1e820 6e 2e 6e 45 71 2b 31 29 20 74 68 61 74 0a 20 20  n.nEq+1) that.  
1e830 20 20 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69    ** can be opti
1e840 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20  mized using the 
1e850 69 6e 64 65 78 2e 20 0a 20 20 20 20 2a 2f 0a 20  index. .    */. 
1e860 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e     if( pc.plan.n
1e870 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq==pProbe->nCol
1e880 75 6d 6e 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f  umn && pProbe->o
1e890 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
1e8a0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1e8b0 65 28 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61  e( pc.plan.wsFla
1e8c0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
1e8d0 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  N_IN );.      te
1e8e0 73 74 63 61 73 65 28 20 70 63 2e 70 6c 61 6e 2e  stcase( pc.plan.
1e8f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1e900 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20  COLUMN_NULL );. 
1e910 20 20 20 20 20 69 66 28 20 28 70 63 2e 70 6c 61       if( (pc.pla
1e920 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
1e930 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45  RE_COLUMN_IN|WHE
1e940 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29  RE_COLUMN_NULL))
1e950 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1e960 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1e970 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a  = WHERE_UNIQUE;.
1e980 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
1e990 3d 3d 30 20 7c 7c 20 28 70 2d 3e 61 4c 65 76 65  ==0 || (p->aLeve
1e9a0 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 77  l[p->i-1].plan.w
1e9b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
1e9c0 4c 4c 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b  LL_UNIQUE)!=0 ){
1e9d0 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c  .          pc.pl
1e9e0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1e9f0 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 3b 0a  ERE_ALL_UNIQUE;.
1ea00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ea10 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1ea20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
1ea30 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ed==0 ){.      i
1ea40 6e 74 20 6a 3b 0a 20 20 20 20 20 20 6a 20 3d 20  nt j;.      j = 
1ea50 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 70 50  (pc.plan.nEq==pP
1ea60 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20  robe->nColumn ? 
1ea70 2d 31 20 3a 20 70 50 72 6f 62 65 2d 3e 61 69 43  -1 : pProbe->aiC
1ea80 6f 6c 75 6d 6e 5b 70 63 2e 70 6c 61 6e 2e 6e 45  olumn[pc.plan.nE
1ea90 71 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  q]);.      if( f
1eaa0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
1eab0 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61 64  r, j, p->notRead
1eac0 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  y, WO_LT|WO_LE|W
1ead0 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78  O_GT|WO_GE, pIdx
1eae0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  ) ){.        Whe
1eaf0 72 65 54 65 72 6d 20 2a 70 54 6f 70 2c 20 2a 70  reTerm *pTop, *p
1eb00 42 74 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  Btm;.        pTo
1eb10 70 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  p = findTerm(pWC
1eb20 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f  , iCur, j, p->no
1eb30 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
1eb40 5f 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  _LE, pIdx);.    
1eb50 20 20 20 20 70 42 74 6d 20 3d 20 66 69 6e 64 54      pBtm = findT
1eb60 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1eb70 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57  , p->notReady, W
1eb80 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78  O_GT|WO_GE, pIdx
1eb90 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
1eba0 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61  RangeScanEst(pPa
1ebb0 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 63 2e  rse, pProbe, pc.
1ebc0 70 6c 61 6e 2e 6e 45 71 2c 20 70 42 74 6d 2c 20  plan.nEq, pBtm, 
1ebd0 70 54 6f 70 2c 20 26 72 61 6e 67 65 44 69 76 29  pTop, &rangeDiv)
1ebe0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
1ebf0 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  op ){.          
1ec00 6e 42 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20  nBound = 1;.    
1ec10 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
1ec20 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  Flags |= WHERE_T
1ec30 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
1ec40 20 20 20 20 70 63 2e 75 73 65 64 20 7c 3d 20 70      pc.used |= p
1ec50 54 6f 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74  Top->prereqRight
1ec60 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
1ec70 63 61 73 65 28 20 70 54 6f 70 2d 3e 70 57 43 21  case( pTop->pWC!
1ec80 3d 70 57 43 20 29 3b 0a 20 20 20 20 20 20 20 20  =pWC );.        
1ec90 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  }.        if( pB
1eca0 74 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tm ){.          
1ecb0 6e 42 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20  nBound++;.      
1ecc0 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1ecd0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d  ags |= WHERE_BTM
1ece0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
1ecf0 20 20 70 63 2e 75 73 65 64 20 7c 3d 20 70 42 74    pc.used |= pBt
1ed00 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1ed10 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1ed20 73 65 28 20 70 42 74 6d 2d 3e 70 57 43 21 3d 70  se( pBtm->pWC!=p
1ed30 57 43 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  WC );.        }.
1ed40 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
1ed50 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52  wsFlags |= (WHER
1ed60 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
1ed70 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1ed80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1ed90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1eda0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1edb0 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
1edc0 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73  index being cons
1edd0 69 64 65 72 65 64 20 77 69 6c 6c 0a 20 20 20 20  idered will.    
1ede0 2a 2a 20 6e 61 74 75 72 61 6c 6c 79 20 73 63 61  ** naturally sca
1edf0 6e 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65  n rows in the re
1ee00 71 75 69 72 65 64 20 6f 72 64 65 72 2c 20 73 65  quired order, se
1ee10 74 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  t the appropriat
1ee20 65 20 66 6c 61 67 73 0a 20 20 20 20 2a 2a 20 69  e flags.    ** i
1ee30 6e 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  n pc.plan.wsFlag
1ee40 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  s. Otherwise, if
1ee50 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1ee60 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 75 74  ER BY clause but
1ee70 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  .    ** the inde
1ee80 78 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73  x will scan rows
1ee90 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
1eea0 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65 20 62  order, set the b
1eeb0 53 6f 72 74 0a 20 20 20 20 2a 2a 20 76 61 72 69  Sort.    ** vari
1eec0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  able.  */.    if
1eed0 28 20 62 53 6f 72 74 20 26 26 20 28 70 53 72 63  ( bSort && (pSrc
1eee0 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
1eef0 4c 45 46 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEFT)==0 ){.    
1ef00 20 20 69 6e 74 20 62 52 65 76 20 3d 20 32 3b 0a    int bRev = 2;.
1ef10 20 20 20 20 20 20 69 6e 74 20 62 4f 62 55 6e 69        int bObUni
1ef20 71 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 57  que = 0;.      W
1ef30 48 45 52 45 54 52 41 43 45 28 28 22 20 20 20 20  HERETRACE(("    
1ef40 20 20 2d 2d 3e 20 62 65 66 6f 72 65 20 69 73 53    --> before isS
1ef50 6f 72 74 49 6e 64 65 78 3a 20 6e 50 72 69 6f 72  ortIndex: nPrior
1ef60 53 61 74 3d 25 64 5c 6e 22 2c 6e 50 72 69 6f 72  Sat=%d\n",nPrior
1ef70 53 61 74 29 29 3b 0a 20 20 20 20 20 20 70 63 2e  Sat));.      pc.
1ef80 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 69 73  plan.nOBSat = is
1ef90 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 2c 20  SortingIndex(p, 
1efa0 70 50 72 6f 62 65 2c 20 69 43 75 72 2c 20 26 62  pProbe, iCur, &b
1efb0 52 65 76 2c 20 26 62 4f 62 55 6e 69 71 75 65 29  Rev, &bObUnique)
1efc0 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
1efd0 43 45 28 28 22 20 20 20 20 20 20 2d 2d 3e 20 61  CE(("      --> a
1efe0 66 74 65 72 20 20 69 73 53 6f 72 74 49 6e 64 65  fter  isSortInde
1eff0 78 3a 20 62 52 65 76 3d 25 64 20 62 4f 62 55 3d  x: bRev=%d bObU=
1f000 25 64 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c  %d nOBSat=%d\n",
1f010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f020 20 20 20 62 52 65 76 2c 20 62 4f 62 55 6e 69 71     bRev, bObUniq
1f030 75 65 2c 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53  ue, pc.plan.nOBS
1f040 61 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  at));.      if( 
1f050 6e 50 72 69 6f 72 53 61 74 3c 70 63 2e 70 6c 61  nPriorSat<pc.pla
1f060 6e 2e 6e 4f 42 53 61 74 20 7c 7c 20 28 70 63 2e  n.nOBSat || (pc.
1f070 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1f080 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29  HERE_ALL_UNIQUE)
1f090 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1f0a0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1f0b0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 3b  = WHERE_ORDERED;
1f0c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 4f 62  .        if( bOb
1f0d0 55 6e 69 71 75 65 20 29 20 70 63 2e 70 6c 61 6e  Unique ) pc.plan
1f0e0 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1f0f0 45 5f 4f 42 5f 55 4e 49 51 55 45 3b 0a 20 20 20  E_OB_UNIQUE;.   
1f100 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
1f110 4f 72 64 65 72 42 79 3d 3d 70 63 2e 70 6c 61 6e  OrderBy==pc.plan
1f120 2e 6e 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20  .nOBSat ){.     
1f130 20 20 20 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20     bSort = 0;.  
1f140 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
1f150 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  Flags |= WHERE_R
1f160 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48 45 52 45  OWID_RANGE|WHERE
1f170 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20  _COLUMN_RANGE;. 
1f180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f190 20 62 52 65 76 20 26 20 31 20 29 20 70 63 2e 70   bRev & 1 ) pc.p
1f1a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
1f1b0 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
1f1c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1f1d0 68 65 72 65 20 69 73 20 61 20 44 49 53 54 49 4e  here is a DISTIN
1f1e0 43 54 20 71 75 61 6c 69 66 69 65 72 20 61 6e 64  CT qualifier and
1f1f0 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c   this index will
1f200 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 0a 20 20   scan rows in.  
1f210 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68    ** order of th
1f220 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65  e DISTINCT expre
1f230 73 73 69 6f 6e 73 2c 20 63 6c 65 61 72 20 62 44  ssions, clear bD
1f240 69 73 74 20 61 6e 64 20 73 65 74 20 74 68 65 20  ist and set the 
1f250 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20 20 20  appropriate.    
1f260 2a 2a 20 66 6c 61 67 73 20 69 6e 20 70 63 2e 70  ** flags in pc.p
1f270 6c 61 6e 2e 77 73 46 6c 61 67 73 2e 20 2a 2f 0a  lan.wsFlags. */.
1f280 20 20 20 20 69 66 28 20 62 44 69 73 74 0a 20 20      if( bDist.  
1f290 20 20 20 26 26 20 69 73 44 69 73 74 69 6e 63 74     && isDistinct
1f2a0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1f2b0 43 2c 20 70 50 72 6f 62 65 2c 20 69 43 75 72 2c  C, pProbe, iCur,
1f2c0 20 70 2d 3e 70 44 69 73 74 69 6e 63 74 2c 20 70   p->pDistinct, p
1f2d0 63 2e 70 6c 61 6e 2e 6e 45 71 29 0a 20 20 20 20  c.plan.nEq).    
1f2e0 20 26 26 20 28 70 63 2e 70 6c 61 6e 2e 77 73 46   && (pc.plan.wsF
1f2f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1f300 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 29  UMN_IN)==0.    )
1f310 7b 0a 20 20 20 20 20 20 62 44 69 73 74 20 3d 20  {.      bDist = 
1f320 30 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  0;.      pc.plan
1f330 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1f340 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48  E_ROWID_RANGE|WH
1f350 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1f360 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 3b  |WHERE_DISTINCT;
1f370 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1f380 66 20 63 75 72 72 65 6e 74 6c 79 20 63 61 6c 63  f currently calc
1f390 75 6c 61 74 69 6e 67 20 74 68 65 20 63 6f 73 74  ulating the cost
1f3a0 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
1f3b0 65 78 20 28 6e 6f 74 20 74 68 65 20 49 50 4b 0a  ex (not the IPK.
1f3c0 20 20 20 20 2a 2a 20 69 6e 64 65 78 29 2c 20 64      ** index), d
1f3d0 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6c 6c 20  etermine if all 
1f3e0 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
1f3f0 64 61 74 61 20 6d 61 79 20 62 65 20 6f 62 74 61  data may be obta
1f400 69 6e 65 64 20 77 69 74 68 6f 75 74 20 0a 20 20  ined without .  
1f410 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d    ** using the m
1f420 61 69 6e 20 74 61 62 6c 65 20 28 69 2e 65 2e 20  ain table (i.e. 
1f430 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  if the index is 
1f440 61 20 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a  a covering.    *
1f450 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73  * index for this
1f460 20 71 75 65 72 79 29 2e 20 49 66 20 69 74 20 69   query). If it i
1f470 73 2c 20 73 65 74 20 74 68 65 20 57 48 45 52 45  s, set the WHERE
1f480 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  _IDX_ONLY flag i
1f490 6e 0a 20 20 20 20 2a 2a 20 70 63 2e 70 6c 61 6e  n.    ** pc.plan
1f4a0 2e 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77  .wsFlags. Otherw
1f4b0 69 73 65 2c 20 73 65 74 20 74 68 65 20 62 4c 6f  ise, set the bLo
1f4c0 6f 6b 75 70 20 76 61 72 69 61 62 6c 65 20 74 6f  okup variable to
1f4d0 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69   true.  */.    i
1f4e0 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
1f4f0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72   Bitmask m = pSr
1f500 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  c->colUsed;.    
1f510 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
1f520 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
1f530 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
1f540 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70         int x = p
1f550 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
1f560 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
1f570 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  BMS-1 ){.       
1f580 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d     m &= ~(((Bitm
1f590 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20  ask)1)<<x);.    
1f5a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f5b0 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a      if( m==0 ){.
1f5c0 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
1f5d0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1f5e0 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
1f5f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f600 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a 20 20 20  bLookup = 1;.   
1f610 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f620 2f 2a 0a 20 20 20 20 2a 2a 20 45 73 74 69 6d 61  /*.    ** Estima
1f630 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1f640 20 72 6f 77 73 20 6f 66 20 6f 75 74 70 75 74 2e   rows of output.
1f650 20 20 46 6f 72 20 61 6e 20 22 78 20 49 4e 20 28    For an "x IN (
1f660 53 45 4c 45 43 54 2e 2e 2e 29 22 0a 20 20 20 20  SELECT...)".    
1f670 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 64  ** constraint, d
1f680 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73  o not let the es
1f690 74 69 6d 61 74 65 20 65 78 63 65 65 64 20 68 61  timate exceed ha
1f6a0 6c 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  lf the rows in t
1f6b0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
1f6c0 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f  .    pc.plan.nRo
1f6d0 77 20 3d 20 28 64 6f 75 62 6c 65 29 28 61 69 52  w = (double)(aiR
1f6e0 6f 77 45 73 74 5b 70 63 2e 70 6c 61 6e 2e 6e 45  owEst[pc.plan.nE
1f6f0 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20  q] * nInMul);.  
1f700 20 20 69 66 28 20 62 49 6e 45 73 74 20 26 26 20    if( bInEst && 
1f710 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a 32 3e 61  pc.plan.nRow*2>a
1f720 69 52 6f 77 45 73 74 5b 30 5d 20 29 7b 0a 20 20  iRowEst[0] ){.  
1f730 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77      pc.plan.nRow
1f740 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2f 32   = aiRowEst[0]/2
1f750 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 3d  ;.      nInMul =
1f760 20 28 69 6e 74 29 28 70 63 2e 70 6c 61 6e 2e 6e   (int)(pc.plan.n
1f770 52 6f 77 20 2f 20 61 69 52 6f 77 45 73 74 5b 70  Row / aiRowEst[p
1f780 63 2e 70 6c 61 6e 2e 6e 45 71 5d 29 3b 0a 20 20  c.plan.nEq]);.  
1f790 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1f7a0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
1f7b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
1f7c0 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74  nstraint is of t
1f7d0 68 65 20 66 6f 72 6d 20 78 3d 56 41 4c 55 45 20  he form x=VALUE 
1f7e0 6f 72 20 78 20 49 4e 20 28 45 31 2c 45 32 2c 2e  or x IN (E1,E2,.
1f7f0 2e 2e 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 77  ..).    ** and w
1f800 65 20 64 6f 20 6e 6f 74 20 74 68 69 6e 6b 20 74  e do not think t
1f810 68 61 74 20 76 61 6c 75 65 73 20 6f 66 20 78 20  hat values of x 
1f820 61 72 65 20 75 6e 69 71 75 65 20 61 6e 64 20 69  are unique and i
1f830 66 20 68 69 73 74 6f 67 72 61 6d 0a 20 20 20 20  f histogram.    
1f840 2a 2a 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  ** data is avail
1f850 61 62 6c 65 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  able for column 
1f860 78 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  x, then it might
1f870 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
1f880 20 2a 2a 20 74 6f 20 67 65 74 20 61 20 62 65 74   ** to get a bet
1f890 74 65 72 20 65 73 74 69 6d 61 74 65 20 6f 6e 20  ter estimate on 
1f8a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1f8b0 77 73 20 62 61 73 65 64 20 6f 6e 0a 20 20 20 20  ws based on.    
1f8c0 2a 2a 20 56 41 4c 55 45 20 61 6e 64 20 68 6f 77  ** VALUE and how
1f8d0 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 76 61 6c   common that val
1f8e0 75 65 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20  ue is according 
1f8f0 74 6f 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d  to the histogram
1f900 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f910 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 28 64   pc.plan.nRow>(d
1f920 6f 75 62 6c 65 29 31 20 26 26 20 70 63 2e 70 6c  ouble)1 && pc.pl
1f930 61 6e 2e 6e 45 71 3d 3d 31 0a 20 20 20 20 20 26  an.nEq==1.     &
1f940 26 20 70 46 69 72 73 74 54 65 72 6d 21 3d 30 20  & pFirstTerm!=0 
1f950 26 26 20 61 69 52 6f 77 45 73 74 5b 31 5d 3e 31  && aiRowEst[1]>1
1f960 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1f970 28 20 28 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  ( (pFirstTerm->e
1f980 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
1f990 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  Q|WO_ISNULL|WO_I
1f9a0 4e 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  N))!=0 );.      
1f9b0 69 66 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  if( pFirstTerm->
1f9c0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1f9d0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b  EQ|WO_ISNULL) ){
1f9e0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1f9f0 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  e( pFirstTerm->e
1fa00 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
1fa10 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1fa20 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d  case( pFirstTerm
1fa30 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1fa40 5f 45 51 55 49 56 20 29 3b 0a 20 20 20 20 20 20  _EQUIV );.      
1fa50 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69 72    testcase( pFir
1fa60 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1fa70 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
1fa80 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 45 71  .        whereEq
1fa90 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
1faa0 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73  e, pProbe, pFirs
1fab0 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  tTerm->pExpr->pR
1fac0 69 67 68 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ight,.          
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fae0 26 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 3b 0a  &pc.plan.nRow);.
1faf0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1fb00 62 49 6e 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  bInEst==0 ){.   
1fb10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69       assert( pFi
1fb20 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1fb30 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
1fb40 20 20 20 20 20 20 77 68 65 72 65 49 6e 53 63 61        whereInSca
1fb50 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72  nEst(pParse, pPr
1fb60 6f 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d  obe, pFirstTerm-
1fb70 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c  >pExpr->x.pList,
1fb80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fb90 20 20 20 20 20 20 20 20 26 70 63 2e 70 6c 61 6e          &pc.plan
1fba0 2e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a  .nRow);.      }.
1fbb0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1fbc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1fbd0 41 54 33 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41  AT3 */..    /* A
1fbe0 64 6a 75 73 74 20 74 68 65 20 6e 75 6d 62 65 72  djust the number
1fbf0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
1fc00 61 6e 64 20 64 6f 77 6e 77 61 72 64 20 74 6f 20  and downward to 
1fc10 72 65 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20  reflect rows.   
1fc20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 65 78 63   ** that are exc
1fc30 6c 75 64 65 64 20 62 79 20 72 61 6e 67 65 20 63  luded by range c
1fc40 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
1fc50 2a 2f 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e  */.    pc.plan.n
1fc60 52 6f 77 20 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52  Row = pc.plan.nR
1fc70 6f 77 2f 72 61 6e 67 65 44 69 76 3b 0a 20 20 20  ow/rangeDiv;.   
1fc80 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f   if( pc.plan.nRo
1fc90 77 3c 31 20 29 20 70 63 2e 70 6c 61 6e 2e 6e 52  w<1 ) pc.plan.nR
1fca0 6f 77 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ow = 1;..    /* 
1fcb0 45 78 70 65 72 69 6d 65 6e 74 73 20 72 75 6e 20  Experiments run 
1fcc0 6f 6e 20 72 65 61 6c 20 53 51 4c 69 74 65 20 64  on real SQLite d
1fcd0 61 74 61 62 61 73 65 73 20 73 68 6f 77 20 74 68  atabases show th
1fce0 61 74 20 74 68 65 20 74 69 6d 65 20 6e 65 65 64  at the time need
1fcf0 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 20  ed.    ** to do 
1fd00 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
1fd10 74 6f 20 6c 6f 63 61 74 65 20 61 20 72 6f 77 20  to locate a row 
1fd20 69 6e 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  in a table or in
1fd30 64 65 78 20 69 73 20 72 6f 75 67 68 6c 79 0a 20  dex is roughly. 
1fd40 20 20 20 2a 2a 20 6c 6f 67 31 30 28 4e 29 20 74     ** log10(N) t
1fd50 69 6d 65 73 20 74 68 65 20 74 69 6d 65 20 74 6f  imes the time to
1fd60 20 6d 6f 76 65 20 66 72 6f 6d 20 6f 6e 65 20 72   move from one r
1fd70 6f 77 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  ow to the next r
1fd80 6f 77 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  ow within.    **
1fd90 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
1fda0 78 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 74  x.  The actual t
1fdb0 69 6d 65 73 20 63 61 6e 20 76 61 72 79 2c 20 77  imes can vary, w
1fdc0 69 74 68 20 74 68 65 20 73 69 7a 65 20 6f 66 0a  ith the size of.
1fdd0 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 62      ** records b
1fde0 65 69 6e 67 20 61 6e 20 69 6d 70 6f 72 74 61 6e  eing an importan
1fdf0 74 20 66 61 63 74 6f 72 2e 20 20 42 6f 74 68 20  t factor.  Both 
1fe00 6d 6f 76 65 73 20 61 6e 64 20 73 65 61 72 63 68  moves and search
1fe10 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 6c  es are.    ** sl
1fe20 6f 77 65 72 20 77 69 74 68 20 6c 61 72 67 65 72  ower with larger
1fe30 20 72 65 63 6f 72 64 73 2c 20 70 72 65 73 75 6d   records, presum
1fe40 61 62 6c 79 20 62 65 63 61 75 73 65 20 66 65 77  ably because few
1fe50 65 72 20 72 65 63 6f 72 64 73 20 66 69 74 0a 20  er records fit. 
1fe60 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67     ** on one pag
1fe70 65 20 61 6e 64 20 68 65 6e 63 65 20 6d 6f 72 65  e and hence more
1fe80 20 70 61 67 65 73 20 68 61 76 65 20 74 6f 20 62   pages have to b
1fe90 65 20 66 65 74 63 68 65 64 2e 0a 20 20 20 20 2a  e fetched..    *
1fea0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 41 4e 41  *.    ** The ANA
1feb0 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 20 61 6e 64  LYZE command and
1fec0 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
1fed0 31 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  1 and sqlite_sta
1fee0 74 33 20 74 61 62 6c 65 73 20 64 6f 0a 20 20 20  t3 tables do.   
1fef0 20 2a 2a 20 6e 6f 74 20 67 69 76 65 20 75 73 20   ** not give us 
1ff00 64 61 74 61 20 6f 6e 20 74 68 65 20 72 65 6c 61  data on the rela
1ff10 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 61  tive sizes of ta
1ff20 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ble and index re
1ff30 63 6f 72 64 73 2e 0a 20 20 20 20 2a 2a 20 53 6f  cords..    ** So
1ff40 20 74 68 69 73 20 63 6f 6d 70 75 74 61 74 69 6f   this computatio
1ff50 6e 20 61 73 73 75 6d 65 73 20 74 61 62 6c 65 20  n assumes table 
1ff60 72 65 63 6f 72 64 73 20 61 72 65 20 61 62 6f 75  records are abou
1ff70 74 20 74 77 69 63 65 20 61 73 20 62 69 67 0a 20  t twice as big. 
1ff80 20 20 20 2a 2a 20 61 73 20 69 6e 64 65 78 20 72     ** as index r
1ff90 65 63 6f 72 64 73 0a 20 20 20 20 2a 2f 0a 20 20  ecords.    */.  
1ffa0 20 20 69 66 28 20 28 70 63 2e 70 6c 61 6e 2e 77    if( (pc.plan.w
1ffb0 73 46 6c 61 67 73 26 7e 28 57 48 45 52 45 5f 52  sFlags&~(WHERE_R
1ffc0 45 56 45 52 53 45 7c 57 48 45 52 45 5f 4f 52 44  EVERSE|WHERE_ORD
1ffd0 45 52 45 44 29 29 3d 3d 57 48 45 52 45 5f 49 44  ERED))==WHERE_ID
1ffe0 58 5f 4f 4e 4c 59 0a 20 20 20 20 20 26 26 20 28  X_ONLY.     && (
1fff0 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  pWC->wctrlFlags 
20000 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
20010 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
20020 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
20030 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a  lConfig.bUseCis.
20040 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
20050 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
20060 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
20070 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
20080 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
20090 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75  s index is not u
200a0 73 65 66 75 6c 20 66 6f 72 20 69 6e 64 65 78 69  seful for indexi
200b0 6e 67 2c 20 62 75 74 20 69 74 20 69 73 20 61 20  ng, but it is a 
200c0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
200d0 20 20 20 20 20 20 2a 2a 20 41 20 66 75 6c 6c 2d        ** A full-
200e0 73 63 61 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  scan of the inde
200f0 78 20 6d 69 67 68 74 20 62 65 20 61 20 6c 69 74  x might be a lit
20100 74 6c 65 20 66 61 73 74 65 72 20 74 68 61 6e 20  tle faster than 
20110 61 20 66 75 6c 6c 2d 73 63 61 6e 0a 20 20 20 20  a full-scan.    
20120 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
20130 65 2c 20 73 6f 20 67 69 76 65 20 74 68 69 73 20  e, so give this 
20140 63 61 73 65 20 61 20 63 6f 73 74 20 73 6c 69 67  case a cost slig
20150 68 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 61  htly less than a
20160 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
20170 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 70  scan. */.      p
20180 63 2e 72 43 6f 73 74 20 3d 20 61 69 52 6f 77 45  c.rCost = aiRowE
20190 73 74 5b 30 5d 2a 33 20 2b 20 70 50 72 6f 62 65  st[0]*3 + pProbe
201a0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
201b0 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
201c0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 56 45 52 5f   |= WHERE_COVER_
201d0 53 43 41 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  SCAN|WHERE_COLUM
201e0 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 7d 65 6c  N_RANGE;.    }el
201f0 73 65 20 69 66 28 20 28 70 63 2e 70 6c 61 6e 2e  se if( (pc.plan.
20200 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
20210 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
20220 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
20230 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20   cost of a full 
20240 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 61 20  table scan is a 
20250 6e 75 6d 62 65 72 20 6f 66 20 6d 6f 76 65 20 6f  number of move o
20260 70 65 72 61 74 69 6f 6e 73 20 65 71 75 61 6c 0a  perations equal.
20270 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
20280 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
20290 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  n the table..   
202a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
202b0 65 20 61 64 64 20 61 6e 20 61 64 64 69 74 69 6f  e add an additio
202c0 6e 61 6c 20 34 78 20 70 65 6e 61 6c 74 79 20 74  nal 4x penalty t
202d0 6f 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  o full table sca
202e0 6e 73 2e 20 20 54 68 69 73 20 63 61 75 73 65 73  ns.  This causes
202f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
20300 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 65  st function to e
20310 72 72 20 6f 6e 20 74 68 65 20 73 69 64 65 20 6f  rr on the side o
20320 66 20 63 68 6f 6f 73 69 6e 67 20 61 6e 20 69 6e  f choosing an in
20330 64 65 78 20 6f 76 65 72 0a 20 20 20 20 20 20 2a  dex over.      *
20340 2a 20 63 68 6f 6f 73 69 6e 67 20 61 20 66 75 6c  * choosing a ful
20350 6c 20 73 63 61 6e 2e 20 20 54 68 69 73 20 34 78  l scan.  This 4x
20360 20 66 75 6c 6c 2d 73 63 61 6e 20 70 65 6e 61 6c   full-scan penal
20370 74 79 20 69 73 20 61 6e 20 61 72 67 75 61 62 6c  ty is an arguabl
20380 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 69 73  e.      ** decis
20390 69 6f 6e 20 61 6e 64 20 6f 6e 65 20 77 68 69 63  ion and one whic
203a0 68 20 77 65 20 65 78 70 65 63 74 20 74 6f 20 72  h we expect to r
203b0 65 76 69 73 69 74 20 69 6e 20 74 68 65 20 66 75  evisit in the fu
203c0 74 75 72 65 2e 20 20 42 75 74 0a 20 20 20 20 20  ture.  But.     
203d0 20 2a 2a 20 69 74 20 73 65 65 6d 73 20 74 6f 20   ** it seems to 
203e0 62 65 20 77 6f 72 6b 69 6e 67 20 77 65 6c 6c 20  be working well 
203f0 65 6e 6f 75 67 68 20 61 74 20 74 68 65 20 6d 6f  enough at the mo
20400 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
20410 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20 3d 20       pc.rCost = 
20420 61 69 52 6f 77 45 73 74 5b 30 5d 2a 34 3b 0a 20  aiRowEst[0]*4;. 
20430 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46       pc.plan.wsF
20440 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
20450 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69  DX_ONLY;.      i
20460 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
20470 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61     pc.plan.wsFla
20480 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 4f 52 44  gs &= ~WHERE_ORD
20490 45 52 45 44 3b 0a 20 20 20 20 20 20 20 20 70 63  ERED;.        pc
204a0 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 6e  .plan.nOBSat = n
204b0 50 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 20 20  PriorSat;.      
204c0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
204d0 20 20 20 6c 6f 67 31 30 4e 20 3d 20 65 73 74 4c     log10N = estL
204e0 6f 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b  og(aiRowEst[0]);
204f0 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20  .      pc.rCost 
20500 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  = pc.plan.nRow;.
20510 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20 29        if( pIdx )
20520 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 4c  {.        if( bL
20530 6f 6f 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20  ookup ){.       
20540 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64     /* For an ind
20550 65 78 20 6c 6f 6f 6b 75 70 20 66 6f 6c 6c 6f 77  ex lookup follow
20560 65 64 20 62 79 20 61 20 74 61 62 6c 65 20 6c 6f  ed by a table lo
20570 6f 6b 75 70 3a 0a 20 20 20 20 20 20 20 20 20 20  okup:.          
20580 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64  **    nInMul ind
20590 65 78 20 73 65 61 72 63 68 65 73 20 74 6f 20 66  ex searches to f
205a0 69 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f 66  ind the start of
205b0 20 65 61 63 68 20 69 6e 64 65 78 20 72 61 6e 67   each index rang
205c0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  e.          **  
205d0 2b 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72  + nRow steps thr
205e0 6f 75 67 68 20 74 68 65 20 69 6e 64 65 78 0a 20  ough the index. 
205f0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e           **  + n
20600 52 6f 77 20 74 61 62 6c 65 20 73 65 61 72 63 68  Row table search
20610 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  es to lookup the
20620 20 74 61 62 6c 65 20 65 6e 74 72 79 20 75 73 69   table entry usi
20630 6e 67 20 74 68 65 20 72 6f 77 69 64 0a 20 20 20  ng the rowid.   
20640 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
20650 20 20 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20      pc.rCost += 
20660 28 6e 49 6e 4d 75 6c 20 2b 20 70 63 2e 70 6c 61  (nInMul + pc.pla
20670 6e 2e 6e 52 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a  n.nRow)*log10N;.
20680 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20690 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
206a0 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
206b0 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  :.          **  
206c0 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20     nInMul index 
206d0 73 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64  searches to find
206e0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74   the initial ent
206f0 72 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ry .          **
20700 20 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20     + nRow steps 
20710 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65  through the inde
20720 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  x.          */. 
20730 20 20 20 20 20 20 20 20 20 70 63 2e 72 43 6f 73           pc.rCos
20740 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31  t += nInMul*log1
20750 30 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0N;.        }.  
20760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20770 20 20 20 2f 2a 20 46 6f 72 20 61 20 72 6f 77 69     /* For a rowi
20780 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6c 6f  d primary key lo
20790 6f 6b 75 70 3a 0a 20 20 20 20 20 20 20 20 2a 2a  okup:.        **
207a0 20 20 20 20 6e 49 6e 4d 75 6c 74 20 74 61 62 6c      nInMult tabl
207b0 65 20 73 65 61 72 63 68 65 73 20 74 6f 20 66 69  e searches to fi
207c0 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65  nd the initial e
207d0 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 72 61  ntry for each ra
207e0 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  nge.        **  
207f0 2b 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72  + nRow steps thr
20800 6f 75 67 68 20 74 68 65 20 74 61 62 6c 65 0a 20  ough the table. 
20810 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
20820 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 6e 49    pc.rCost += nI
20830 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20  nMul*log10N;.   
20840 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20850 2f 2a 20 41 64 64 20 69 6e 20 74 68 65 20 65 73  /* Add in the es
20860 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20  timated cost of 
20870 73 6f 72 74 69 6e 67 20 74 68 65 20 72 65 73 75  sorting the resu
20880 6c 74 2e 20 20 41 63 74 75 61 6c 20 65 78 70 65  lt.  Actual expe
20890 72 69 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20  rimental.    ** 
208a0 6d 65 61 73 75 72 65 6d 65 6e 74 73 20 6f 66 20  measurements of 
208b0 73 6f 72 74 69 6e 67 20 70 65 72 66 6f 72 6d 61  sorting performa
208c0 6e 63 65 20 69 6e 20 53 51 4c 69 74 65 20 73 68  nce in SQLite sh
208d0 6f 77 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  ow that sorting 
208e0 74 69 6d 65 0a 20 20 20 20 2a 2a 20 61 64 64 73  time.    ** adds
208f0 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e 29 20 74 6f   C*N*log10(N) to
20900 20 74 68 65 20 63 6f 73 74 2c 20 77 68 65 72 65   the cost, where
20910 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
20920 20 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20 0a   of rows to be .
20930 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 61 6e      ** sorted an
20940 64 20 43 20 69 73 20 61 20 66 61 63 74 6f 72 20  d C is a factor 
20950 62 65 74 77 65 65 6e 20 31 2e 39 35 20 61 6e 64  between 1.95 and
20960 20 34 2e 33 2e 20 20 57 65 20 77 69 6c 6c 20 73   4.3.  We will s
20970 70 6c 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  plit the.    ** 
20980 64 69 66 66 65 72 65 6e 63 65 20 61 6e 64 20 73  difference and s
20990 65 6c 65 63 74 20 43 20 6f 66 20 33 2e 30 2e 0a  elect C of 3.0..
209a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62      */.    if( b
209b0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 64 6f  Sort ){.      do
209c0 75 62 6c 65 20 6d 20 3d 20 65 73 74 4c 6f 67 28  uble m = estLog(
209d0 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a 28 6e 4f  pc.plan.nRow*(nO
209e0 72 64 65 72 42 79 20 2d 20 70 63 2e 70 6c 61 6e  rderBy - pc.plan
209f0 2e 6e 4f 42 53 61 74 29 2f 6e 4f 72 64 65 72 42  .nOBSat)/nOrderB
20a00 79 29 3b 0a 20 20 20 20 20 20 6d 20 2a 3d 20 28  y);.      m *= (
20a10 64 6f 75 62 6c 65 29 28 70 63 2e 70 6c 61 6e 2e  double)(pc.plan.
20a20 6e 4f 42 53 61 74 20 3f 20 32 20 3a 20 33 29 3b  nOBSat ? 2 : 3);
20a30 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20  .      pc.rCost 
20a40 2b 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a  += pc.plan.nRow*
20a50 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  m;.    }.    if(
20a60 20 62 44 69 73 74 20 29 7b 0a 20 20 20 20 20 20   bDist ){.      
20a70 70 63 2e 72 43 6f 73 74 20 2b 3d 20 70 63 2e 70  pc.rCost += pc.p
20a80 6c 61 6e 2e 6e 52 6f 77 2a 65 73 74 4c 6f 67 28  lan.nRow*estLog(
20a90 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 2a 33 3b  pc.plan.nRow)*3;
20aa0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 2a  .    }..    /***
20ab0 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
20ac0 74 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 6e  this index has n
20ad0 6f 77 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64  ow been computed
20ae0 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49   ****/..    /* I
20af0 66 20 74 68 65 72 65 20 61 72 65 20 61 64 64 69  f there are addi
20b00 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e  tional constrain
20b10 74 73 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  ts on this table
20b20 20 74 68 61 74 20 63 61 6e 6e 6f 74 0a 20 20 20   that cannot.   
20b30 20 2a 2a 20 62 65 20 75 73 65 64 20 77 69 74 68   ** be used with
20b40 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64   the current ind
20b50 65 78 2c 20 62 75 74 20 77 68 69 63 68 20 6d 69  ex, but which mi
20b60 67 68 74 20 6c 6f 77 65 72 20 74 68 65 20 6e 75  ght lower the nu
20b70 6d 62 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 6f  mber.    ** of o
20b80 75 74 70 75 74 20 72 6f 77 73 2c 20 61 64 6a 75  utput rows, adju
20b90 73 74 20 74 68 65 20 6e 52 6f 77 20 76 61 6c 75  st the nRow valu
20ba0 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 20  e accordingly.  
20bb0 54 68 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 2a  This only .    *
20bc0 2a 20 6d 61 74 74 65 72 73 20 69 66 20 74 68 65  * matters if the
20bd0 20 63 75 72 72 65 6e 74 20 69 6e 64 65 78 20 69   current index i
20be0 73 20 74 68 65 20 6c 65 61 73 74 20 63 6f 73 74  s the least cost
20bf0 6c 79 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f  ly, so do not bo
20c00 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 69 74 68  ther.    ** with
20c10 20 74 68 69 73 20 73 74 65 70 20 69 66 20 77 65   this step if we
20c20 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68   already know th
20c30 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f  is index will no
20c40 74 20 62 65 20 63 68 6f 73 65 6e 2e 0a 20 20 20  t be chosen..   
20c50 20 2a 2a 20 41 6c 73 6f 2c 20 6e 65 76 65 72 20   ** Also, never 
20c60 72 65 64 75 63 65 20 74 68 65 20 6f 75 74 70 75  reduce the outpu
20c70 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 65 6c 6f  t row count belo
20c80 77 20 32 20 75 73 69 6e 67 20 74 68 69 73 20 73  w 2 using this s
20c90 74 65 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tep..    **.    
20ca0 2a 2a 20 49 74 20 69 73 20 63 72 69 74 69 63 61  ** It is critica
20cb0 6c 20 74 68 61 74 20 74 68 65 20 6e 6f 74 56 61  l that the notVa
20cc0 6c 69 64 20 6d 61 73 6b 20 62 65 20 75 73 65 64  lid mask be used
20cd0 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66   here instead of
20ce0 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 6f 74 52  .    ** the notR
20cf0 65 61 64 79 20 6d 61 73 6b 2e 20 20 57 68 65 6e  eady mask.  When
20d00 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 22 6f   computing an "o
20d10 70 74 69 6d 61 6c 22 20 69 6e 64 65 78 2c 20 74  ptimal" index, t
20d20 68 65 20 6e 6f 74 52 65 61 64 79 0a 20 20 20 20  he notReady.    
20d30 2a 2a 20 6d 61 73 6b 20 77 69 6c 6c 20 6f 6e 6c  ** mask will onl
20d40 79 20 68 61 76 65 20 6f 6e 65 20 62 69 74 20 73  y have one bit s
20d50 65 74 20 2d 20 74 68 65 20 62 69 74 20 66 6f 72  et - the bit for
20d60 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
20d70 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  le..    ** The n
20d80 6f 74 56 61 6c 69 64 20 6d 61 73 6b 2c 20 6f 6e  otValid mask, on
20d90 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
20da0 20 61 6c 77 61 79 73 20 68 61 73 20 61 6c 6c 20   always has all 
20db0 62 69 74 73 20 73 65 74 20 66 6f 72 0a 20 20 20  bits set for.   
20dc0 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74 20   ** tables that 
20dd0 61 72 65 20 6e 6f 74 20 69 6e 20 6f 75 74 65 72  are not in outer
20de0 20 6c 6f 6f 70 73 2e 20 20 49 66 20 6e 6f 74 52   loops.  If notR
20df0 65 61 64 79 20 69 73 20 75 73 65 64 20 68 65 72  eady is used her
20e00 65 20 69 6e 73 74 65 61 64 0a 20 20 20 20 2a 2a  e instead.    **
20e10 20 6f 66 20 6e 6f 74 56 61 6c 69 64 2c 20 74 68   of notValid, th
20e20 65 6e 20 61 20 6f 70 74 69 6d 61 6c 20 69 6e 64  en a optimal ind
20e30 65 78 20 74 68 61 74 20 64 65 70 65 6e 64 73 20  ex that depends 
20e40 6f 6e 20 69 6e 6e 65 72 20 6a 6f 69 6e 73 20 6c  on inner joins l
20e50 6f 6f 70 73 0a 20 20 20 20 2a 2a 20 6d 69 67 68  oops.    ** migh
20e60 74 20 62 65 20 73 65 6c 65 63 74 65 64 20 65 76  t be selected ev
20e70 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  en when there ex
20e80 69 73 74 73 20 61 6e 20 6f 70 74 69 6d 61 6c 20  ists an optimal 
20e90 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 0a 20  index that has. 
20ea0 20 20 20 2a 2a 20 6e 6f 20 73 75 63 68 20 64 65     ** no such de
20eb0 70 65 6e 64 65 6e 63 79 2e 0a 20 20 20 20 2a 2f  pendency..    */
20ec0 0a 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e  .    if( pc.plan
20ed0 2e 6e 52 6f 77 3e 32 20 26 26 20 70 63 2e 72 43  .nRow>2 && pc.rC
20ee0 6f 73 74 3c 3d 70 2d 3e 63 6f 73 74 2e 72 43 6f  ost<=p->cost.rCo
20ef0 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
20f00 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
20f10 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20f20 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
20f30 20 20 69 6e 74 20 6e 53 6b 69 70 45 71 20 3d 20    int nSkipEq = 
20f40 70 63 2e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f  pc.plan.nEq;   /
20f50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 63  * Number of == c
20f60 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b  onstraints to sk
20f70 69 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ip */.      int 
20f80 6e 53 6b 69 70 52 61 6e 67 65 20 3d 20 6e 42 6f  nSkipRange = nBo
20f90 75 6e 64 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  und;     /* Numb
20fa0 65 72 20 6f 66 20 3c 20 63 6f 6e 73 74 72 61 69  er of < constrai
20fb0 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  nts to skip */. 
20fc0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 74 68 69       Bitmask thi
20fd0 73 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  sTab;           
20fe0 20 20 2f 2a 20 42 69 74 6d 61 70 20 66 6f 72 20    /* Bitmap for 
20ff0 70 53 72 63 20 2a 2f 0a 0a 20 20 20 20 20 20 74  pSrc */..      t
21000 68 69 73 54 61 62 20 3d 20 67 65 74 4d 61 73 6b  hisTab = getMask
21010 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  (pWC->pMaskSet, 
21020 69 43 75 72 29 3b 0a 20 20 20 20 20 20 66 6f 72  iCur);.      for
21030 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b  (pTerm=pWC->a, k
21040 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 70 63 2e  =pWC->nTerm; pc.
21050 70 6c 61 6e 2e 6e 52 6f 77 3e 32 20 26 26 20 6b  plan.nRow>2 && k
21060 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; k--, pTerm++){
21070 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
21080 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
21090 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e  RM_VIRTUAL ) con
210a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
210b0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
210c0 71 41 6c 6c 20 26 20 70 2d 3e 6e 6f 74 56 61 6c  qAll & p->notVal
210d0 69 64 29 21 3d 74 68 69 73 54 61 62 20 29 20 63  id)!=thisTab ) c
210e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
210f0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
21100 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
21110 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
21120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
21130 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20 20 20   nSkipEq ){.    
21140 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
21150 65 20 74 68 65 20 66 69 72 73 74 20 70 63 2e 70  e the first pc.p
21160 6c 61 6e 2e 6e 45 71 20 65 71 75 61 6c 69 74 79  lan.nEq equality
21170 20 6d 61 74 63 68 65 73 20 73 69 6e 63 65 20 74   matches since t
21180 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
21190 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65       ** has alre
211a0 61 64 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f  ady accounted fo
211b0 72 20 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20  r these */.     
211c0 20 20 20 20 20 20 20 6e 53 6b 69 70 45 71 2d 2d         nSkipEq--
211d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
211e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
211f0 2a 20 41 73 73 75 6d 65 20 65 61 63 68 20 61 64  * Assume each ad
21200 64 69 74 69 6f 6e 61 6c 20 65 71 75 61 6c 69 74  ditional equalit
21210 79 20 6d 61 74 63 68 20 72 65 64 75 63 65 73 20  y match reduces 
21220 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
21230 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69         ** set si
21240 7a 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ze by a factor o
21250 66 20 31 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  f 10 */.        
21260 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77      pc.plan.nRow
21270 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   /= 10;.        
21280 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
21290 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
212a0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
212b0 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
212c0 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  E) ){.          
212d0 69 66 28 20 6e 53 6b 69 70 52 61 6e 67 65 20 29  if( nSkipRange )
212e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
212f0 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73   Ignore the firs
21300 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 72 61 6e  t nSkipRange ran
21310 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73  ge constraints s
21320 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20  ince the index. 
21330 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
21340 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e  s already accoun
21350 74 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f  ted for these */
21360 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b  .            nSk
21370 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20 20 20  ipRange--;.     
21380 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21390 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
213a0 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  e each additiona
213b0 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  l range constrai
213c0 6e 74 20 72 65 64 75 63 65 73 20 74 68 65 20 72  nt reduces the r
213d0 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20  esult.          
213e0 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79    ** set size by
213f0 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 20   a factor of 3. 
21400 20 49 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63   Indexed range c
21410 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 64 75 63  onstraints reduc
21420 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
21430 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
21440 65 20 62 79 20 61 20 6c 61 72 67 65 72 20 66 61  e by a larger fa
21450 63 74 6f 72 3a 20 34 2e 20 20 57 65 20 6d 61 6b  ctor: 4.  We mak
21460 65 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65 0a  e indexed range.
21470 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
21480 6f 72 65 20 73 65 6c 65 63 74 69 76 65 20 69 6e  ore selective in
21490 74 65 6e 74 69 6f 6e 61 6c 6c 79 20 62 65 63 61  tentionally beca
214a0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 6a 65  use of the subje
214b0 63 74 69 76 65 20 0a 20 20 20 20 20 20 20 20 20  ctive .         
214c0 20 20 20 2a 2a 20 6f 62 73 65 72 76 61 74 69 6f     ** observatio
214d0 6e 20 74 68 61 74 20 69 6e 64 65 78 65 64 20 72  n that indexed r
214e0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
214f0 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 6f 72 65   really are more
21500 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21510 73 65 6c 65 63 74 69 76 65 20 69 6e 20 70 72 61  selective in pra
21520 63 74 69 63 65 2c 20 6f 6e 20 61 76 65 72 61 67  ctice, on averag
21530 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
21540 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f    pc.plan.nRow /
21550 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 3;.          }
21560 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
21570 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
21580 61 74 6f 72 20 26 20 57 4f 5f 4e 4f 4f 50 29 3d  ator & WO_NOOP)=
21590 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
215a0 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  /* Any other exp
215b0 72 65 73 73 69 6f 6e 20 6c 6f 77 65 72 73 20 74  ression lowers t
215c0 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f  he output row co
215d0 75 6e 74 20 62 79 20 68 61 6c 66 20 2a 2f 0a 20  unt by half */. 
215e0 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e           pc.plan
215f0 2e 6e 52 6f 77 20 2f 3d 20 32 3b 0a 20 20 20 20  .nRow /= 2;.    
21600 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21610 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e      if( pc.plan.
21620 6e 52 6f 77 3c 32 20 29 20 70 63 2e 70 6c 61 6e  nRow<2 ) pc.plan
21630 2e 6e 52 6f 77 20 3d 20 32 3b 0a 20 20 20 20 7d  .nRow = 2;.    }
21640 0a 0a 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  ...    WHERETRAC
21650 45 28 28 0a 20 20 20 20 20 20 22 20 20 20 20 20  E((.      "     
21660 20 6e 45 71 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25   nEq=%d nInMul=%
21670 64 20 72 61 6e 67 65 44 69 76 3d 25 64 20 62 53  d rangeDiv=%d bS
21680 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d 25  ort=%d bLookup=%
21690 64 20 77 73 46 6c 61 67 73 3d 30 78 25 30 38 78  d wsFlags=0x%08x
216a0 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20 20  \n".      "     
216b0 20 6e 6f 74 52 65 61 64 79 3d 30 78 25 6c 6c 78   notReady=0x%llx
216c0 20 6c 6f 67 31 30 4e 3d 25 2e 31 66 20 6e 52 6f   log10N=%.1f nRo
216d0 77 3d 25 2e 31 66 20 63 6f 73 74 3d 25 2e 31 66  w=%.1f cost=%.1f
216e0 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20 20  \n".      "     
216f0 20 75 73 65 64 3d 30 78 25 6c 6c 78 20 6e 4f 42   used=0x%llx nOB
21700 53 61 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Sat=%d\n",.     
21710 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 2c 20 6e 49   pc.plan.nEq, nI
21720 6e 4d 75 6c 2c 20 28 69 6e 74 29 72 61 6e 67 65  nMul, (int)range
21730 44 69 76 2c 20 62 53 6f 72 74 2c 20 62 4c 6f 6f  Div, bSort, bLoo
21740 6b 75 70 2c 20 70 63 2e 70 6c 61 6e 2e 77 73 46  kup, pc.plan.wsF
21750 6c 61 67 73 2c 0a 20 20 20 20 20 20 70 2d 3e 6e  lags,.      p->n
21760 6f 74 52 65 61 64 79 2c 20 6c 6f 67 31 30 4e 2c  otReady, log10N,
21770 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2c 20 70   pc.plan.nRow, p
21780 63 2e 72 43 6f 73 74 2c 20 70 63 2e 75 73 65 64  c.rCost, pc.used
21790 2c 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e  ,.      pc.plan.
217a0 6e 4f 42 53 61 74 0a 20 20 20 20 29 29 3b 0a 0a  nOBSat.    ));..
217b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
217c0 6e 64 65 78 20 69 73 20 74 68 65 20 62 65 73 74  ndex is the best
217d0 20 77 65 20 68 61 76 65 20 73 65 65 6e 20 73 6f   we have seen so
217e0 20 66 61 72 2c 20 74 68 65 6e 20 72 65 63 6f 72   far, then recor
217f0 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e  d this.    ** in
21800 64 65 78 20 61 6e 64 20 69 74 73 20 63 6f 73 74  dex and its cost
21810 20 69 6e 20 74 68 65 20 70 2d 3e 63 6f 73 74 20   in the p->cost 
21820 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  structure..    *
21830 2f 0a 20 20 20 20 69 66 28 20 28 21 70 49 64 78  /.    if( (!pIdx
21840 20 7c 7c 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c   || pc.plan.wsFl
21850 61 67 73 29 20 26 26 20 63 6f 6d 70 61 72 65 43  ags) && compareC
21860 6f 73 74 28 26 70 63 2c 20 26 70 2d 3e 63 6f 73  ost(&pc, &p->cos
21870 74 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63  t) ){.      p->c
21880 6f 73 74 20 3d 20 70 63 3b 0a 20 20 20 20 20 20  ost = pc;.      
21890 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  p->cost.plan.wsF
218a0 6c 61 67 73 20 26 3d 20 77 73 46 6c 61 67 4d 61  lags &= wsFlagMa
218b0 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73  sk;.      p->cos
218c0 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20  t.plan.u.pIdx = 
218d0 70 49 64 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  pIdx;.    }..   
218e0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
218f0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
21900 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79  lause, then only
21910 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20   that one index 
21920 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  is.    ** consid
21930 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ered. */.    if(
21940 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20   pSrc->pIndex ) 
21950 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52  break;..    /* R
21960 65 73 65 74 20 6d 61 73 6b 73 20 66 6f 72 20 74  eset masks for t
21970 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 69 6e  he next index in
21980 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
21990 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28   wsFlagMask = ~(
219a0 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
219b0 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
219c0 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  );.    eqTermMas
219d0 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73  k = idxEqTermMas
219e0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
219f0 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
21a00 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
21a10 74 68 65 20 53 51 4c 49 54 45 5f 52 65 76 65 72  the SQLITE_Rever
21a20 73 65 4f 72 64 65 72 20 66 6c 61 67 0a 20 20 2a  seOrder flag.  *
21a30 2a 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72  * is set, then r
21a40 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72  everse the order
21a50 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
21a60 77 69 6c 6c 20 62 65 20 73 63 61 6e 6e 65 64 0a  will be scanned.
21a70 20 20 2a 2a 20 69 6e 2e 20 54 68 69 73 20 69 73    ** in. This is
21a80 20 75 73 65 64 20 66 6f 72 20 61 70 70 6c 69 63   used for applic
21a90 61 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20 74  ation testing, t
21aa0 6f 20 68 65 6c 70 20 66 69 6e 64 20 63 61 73 65  o help find case
21ab0 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 61 70 70  s.  ** where app
21ac0 6c 69 63 61 74 69 6f 6e 20 62 65 68 61 76 69 6f  lication behavio
21ad0 72 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  r depends on the
21ae0 20 28 75 6e 64 65 66 69 6e 65 64 29 20 6f 72 64   (undefined) ord
21af0 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 53 51 4c  er that.  ** SQL
21b00 69 74 65 20 6f 75 74 70 75 74 73 20 72 6f 77 73  ite outputs rows
21b10 20 69 6e 20 69 6e 20 74 68 65 20 61 62 73 65 6e   in in the absen
21b20 63 65 20 6f 66 20 61 6e 20 4f 52 44 45 52 20 42  ce of an ORDER B
21b30 59 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20 20  Y clause.  */.  
21b40 69 66 28 20 21 70 2d 3e 70 4f 72 64 65 72 42 79  if( !p->pOrderBy
21b50 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
21b60 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
21b70 65 76 65 72 73 65 4f 72 64 65 72 20 29 7b 0a 20  everseOrder ){. 
21b80 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e     p->cost.plan.
21b90 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
21ba0 5f 52 45 56 45 52 53 45 3b 0a 20 20 7d 0a 0a 20  _REVERSE;.  }.. 
21bb0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
21bc0 65 72 42 79 20 7c 7c 20 28 70 2d 3e 63 6f 73 74  erBy || (p->cost
21bd0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48  .plan.wsFlags&WH
21be0 45 52 45 5f 4f 52 44 45 52 45 44 29 3d 3d 30 20  ERE_ORDERED)==0 
21bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
21c00 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
21c10 3d 3d 30 20 7c 7c 20 28 70 2d 3e 63 6f 73 74 2e  ==0 || (p->cost.
21c20 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45  plan.wsFlags&WHE
21c30 52 45 5f 52 4f 57 49 44 5f 45 51 29 3d 3d 30 20  RE_ROWID_EQ)==0 
21c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
21c50 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20  c->pIndex==0 .  
21c60 20 20 20 20 20 7c 7c 20 70 2d 3e 63 6f 73 74 2e       || p->cost.
21c70 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 0a  plan.u.pIdx==0 .
21c80 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 63 6f 73         || p->cos
21c90 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70  t.plan.u.pIdx==p
21ca0 53 72 63 2d 3e 70 49 6e 64 65 78 20 0a 20 20 29  Src->pIndex .  )
21cb0 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  ;..  WHERETRACE(
21cc0 28 22 20 20 20 62 65 73 74 20 69 6e 64 65 78 20  ("   best index 
21cd0 69 73 20 25 73 20 63 6f 73 74 3d 25 2e 31 66 5c  is %s cost=%.1f\
21ce0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  n",.         p->
21cf0 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
21d00 20 3f 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e   ? p->cost.plan.
21d10 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  u.pIdx->zName : 
21d20 22 69 70 6b 22 2c 0a 20 20 20 20 20 20 20 20 20  "ipk",.         
21d30 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 29 29 3b  p->cost.rCost));
21d40 0a 20 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75  .  .  bestOrClau
21d50 73 65 49 6e 64 65 78 28 70 29 3b 0a 20 20 62 65  seIndex(p);.  be
21d60 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  stAutomaticIndex
21d70 28 70 29 3b 0a 20 20 70 2d 3e 63 6f 73 74 2e 70  (p);.  p->cost.p
21d80 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65  lan.wsFlags |= e
21d90 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  qTermMask;.}../*
21da0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65  .** Find the que
21db0 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65  ry plan for acce
21dc0 73 73 69 6e 67 20 74 61 62 6c 65 20 70 53 72 63  ssing table pSrc
21dd0 2d 3e 70 54 61 62 2e 20 57 72 69 74 65 20 74 68  ->pTab. Write th
21de0 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
21df0 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
21e00 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  t into the Where
21e10 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70  Cost object supp
21e20 6c 69 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20  lied .** as the 
21e30 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20  last parameter. 
21e40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
21e50 79 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20  y calculate the 
21e60 63 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20  cost of.** both 
21e70 72 65 61 6c 20 61 6e 64 20 76 69 72 74 75 61 6c  real and virtual
21e80 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2a   table scans..**
21e90 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
21ea0 6e 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  n does not take 
21eb0 4f 52 44 45 52 20 42 59 20 6f 72 20 44 49 53 54  ORDER BY or DIST
21ec0 49 4e 43 54 20 69 6e 74 6f 20 61 63 63 6f 75 6e  INCT into accoun
21ed0 74 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  t.  Nor.** does 
21ee0 69 74 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20  it remember the 
21ef0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 71 75  virtual table qu
21f00 65 72 79 20 70 6c 61 6e 2e 20 20 41 6c 6c 20 69  ery plan.  All i
21f10 74 20 64 6f 65 73 20 69 73 20 63 6f 6d 70 75 74  t does is comput
21f20 65 0a 2a 2a 20 74 68 65 20 63 6f 73 74 20 77 68  e.** the cost wh
21f30 69 6c 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ile determining 
21f40 69 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a  if an OR optimiz
21f50 61 74 69 6f 6e 20 69 73 20 61 70 70 6c 69 63 61  ation is applica
21f60 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 64 65 74  ble.  The.** det
21f70 61 69 6c 73 20 77 69 6c 6c 20 62 65 20 72 65 63  ails will be rec
21f80 6f 6e 73 69 64 65 72 65 64 20 6c 61 74 65 72 20  onsidered later 
21f90 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
21fa0 69 6f 6e 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ion is found to 
21fb0 62 65 0a 2a 2a 20 61 70 70 6c 69 63 61 62 6c 65  be.** applicable
21fc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21fd0 20 62 65 73 74 49 6e 64 65 78 28 57 68 65 72 65   bestIndex(Where
21fe0 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 23 69 66  BestIdx *p){.#if
21ff0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22000 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
22010 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 2d  if( IsVirtual(p-
22020 3e 70 53 72 63 2d 3e 70 54 61 62 29 20 29 7b 0a  >pSrc->pTab) ){.
22030 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
22040 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
22050 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 70 49   = 0;.    p->ppI
22060 64 78 49 6e 66 6f 20 3d 20 26 70 49 64 78 49 6e  dxInfo = &pIdxIn
22070 66 6f 3b 0a 20 20 20 20 62 65 73 74 56 69 72 74  fo;.    bestVirt
22080 75 61 6c 49 6e 64 65 78 28 70 29 3b 0a 20 20 20  ualIndex(p);.   
22090 20 61 73 73 65 72 74 28 20 70 49 64 78 49 6e 66   assert( pIdxInf
220a0 6f 21 3d 30 20 7c 7c 20 70 2d 3e 70 50 61 72 73  o!=0 || p->pPars
220b0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
220c0 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 70  led );.    if( p
220d0 49 64 78 49 6e 66 6f 20 26 26 20 70 49 64 78 49  IdxInfo && pIdxI
220e0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
220f0 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73  dxStr ){.      s
22100 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
22110 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
22120 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22130 44 62 46 72 65 65 28 70 2d 3e 70 50 61 72 73 65  DbFree(p->pParse
22140 2d 3e 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  ->db, pIdxInfo);
22150 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
22160 20 20 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65    {.    bestBtre
22170 65 49 6e 64 65 78 28 70 29 3b 0a 20 20 7d 0a 7d  eIndex(p);.  }.}
22180 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
22190 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
221a0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
221b0 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
221c0 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
221d0 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
221e0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
221f0 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
22200 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
22210 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
22220 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
22230 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
22240 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
22250 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
22260 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
22270 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
22280 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
22290 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
222a0 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
222b0 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
222c0 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
222d0 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
222e0 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
222f0 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
22300 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
22310 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
22320 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
22330 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
22340 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
22350 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
22360 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
22370 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
22380 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
22390 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
223a0 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
223b0 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
223c0 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
223d0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
223e0 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
223f0 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
22400 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e  ..**.** IMPLEMEN
22410 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35  TATION-OF: R-245
22420 39 37 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74  97-58655 No test
22430 73 20 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74  s are done for t
22440 65 72 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a  erms that are.**
22450 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69   completely sati
22460 73 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73  sfied by indices
22470 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
22480 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
22490 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
224a0 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
224b0 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
224c0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
224d0 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
224e0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
224f0 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
22500 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
22510 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
22520 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
22530 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
22540 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
22550 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
22560 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
22570 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
22580 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
22590 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
225a0 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
225b0 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
225c0 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
225d0 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
225e0 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
225f0 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
22600 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
22610 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
22620 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
22630 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
22640 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
22650 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22660 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
22670 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
22680 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
22690 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
226a0 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
226b0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
226c0 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26  ODED)==0.      &
226d0 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  & (pLevel->iLeft
226e0 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48  Join==0 || ExprH
226f0 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
22700 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
22710 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  Join)).  ){.    
22720 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
22730 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
22740 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61    if( pTerm->iPa
22750 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rent>=0 ){.     
22760 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
22770 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43  er = &pTerm->pWC
22780 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65  ->a[pTerm->iPare
22790 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nt];.      if( (
227a0 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64  --pOther->nChild
227b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
227c0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
227d0 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20  el, pOther);.   
227e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
227f0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
22800 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
22810 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20  de to apply the 
22820 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
22830 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74  string zAff.** t
22840 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  o the n register
22850 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
22860 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e  se. .**.** As an
22870 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53   optimization, S
22880 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
22890 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72  ntries (which ar
228a0 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65  e no-ops) at the
228b0 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e  .** beginning an
228c0 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72  d end of zAff ar
228d0 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61  e ignored.  If a
228e0 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41  ll entries in zA
228f0 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45  ff are.** SQLITE
22900 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20  _AFF_NONE, then 
22910 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e  no code gets gen
22920 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  erated..**.** Th
22930 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
22940 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
22950 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68   zAff so that th
22960 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65  e caller is free
22970 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41  .** to modify zA
22980 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ff after this ro
22990 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
229a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
229b0 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
229c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
229d0 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20  nt base, int n, 
229e0 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56  char *zAff){.  V
229f0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
22a00 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41  >pVdbe;.  if( zA
22a10 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ff==0 ){.    ass
22a20 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
22a30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
22a40 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
22a50 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
22a60 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20  );..  /* Adjust 
22a70 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b  base and n to sk
22a80 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41  ip over SQLITE_A
22a90 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
22aa0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
22ab0 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66  .  ** and end of
22ac0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
22ad0 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ring..  */.  whi
22ae0 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b  le( n>0 && zAff[
22af0 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  0]==SQLITE_AFF_N
22b00 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  ONE ){.    n--;.
22b10 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20      base++;.    
22b20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68  zAff++;.  }.  wh
22b30 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66  ile( n>1 && zAff
22b40 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  [n-1]==SQLITE_AF
22b50 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
22b60 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64  -;.  }..  /* Cod
22b70 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  e the OP_Affinit
22b80 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72  y opcode if ther
22b90 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65  e is anything le
22ba0 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69  ft to do. */.  i
22bb0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  f( n>0 ){.    sq
22bc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22bd0 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
22be0 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71  base, n);.    sq
22bf0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
22c00 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e  4(v, -1, zAff, n
22c10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
22c20 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
22c30 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61  hange(pParse, ba
22c40 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  se, n);.  }.}...
22c50 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
22c60 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
22c70 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
22c80 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
22c90 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
22ca0 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
22cb0 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
22cc0 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
22cd0 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
22ce0 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
22cf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
22d00 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
22d10 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
22d20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
22d30 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   iReg..**.** For
22d40 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
22d50 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
22d60 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
22d70 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
22d80 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
22d90 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
22da0 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
22db0 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
22dc0 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
22dd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
22de0 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
22df0 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
22e00 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
22e10 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f X..*/.static i
22e20 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  nt codeEqualityT
22e30 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
22e40 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
22e50 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
22e60 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
22e70 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
22e80 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
22e90 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
22ea0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
22eb0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
22ec0 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20  /* The level of 
22ed0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
22ee0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
22ef0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20  n */.  int iEq, 
22f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
22f10 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c  dex of the equal
22f20 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ity term within 
22f30 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  this level */.  
22f40 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20  int iTarget     
22f50 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74      /* Attempt t
22f60 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20  o leave results 
22f70 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
22f80 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
22f90 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
22fa0 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
22fb0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
22fc0 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20  nt iReg;        
22fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
22fe0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
22ff0 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65  sults */..  asse
23000 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b  rt( iTarget>0 );
23010 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  .  if( pX->op==T
23020 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67  K_EQ ){.    iReg
23030 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
23040 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
23050 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pX->pRight, iTa
23060 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
23070 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  f( pX->op==TK_IS
23080 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67  NULL ){.    iReg
23090 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
230a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
230b0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
230c0 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20   iReg);.#ifndef 
230d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
230e0 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
230f0 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20    int eType;.   
23100 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73   int iTab;.    s
23110 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
23120 6e 3b 0a 20 20 20 20 75 38 20 62 52 65 76 20 3d  n;.    u8 bRev =
23130 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
23140 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
23150 45 56 45 52 53 45 29 21 3d 30 3b 0a 0a 20 20 20  EVERSE)!=0;..   
23160 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
23170 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
23180 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 0a  RE_INDEXED)!=0 .
23190 20 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d        && pLevel-
231a0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 61 53  >plan.u.pIdx->aS
231b0 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20  ortOrder[iEq].  
231c0 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
231d0 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20  ase( iEq==0 );. 
231e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
231f0 45 71 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  Eq==pLevel->plan
23200 2e 75 2e 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .u.pIdx->nColumn
23210 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
23220 63 61 73 65 28 20 69 45 71 3e 30 20 26 26 20 69  case( iEq>0 && i
23230 45 71 2b 31 3c 70 4c 65 76 65 6c 2d 3e 70 6c 61  Eq+1<pLevel->pla
23240 6e 2e 75 2e 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  n.u.pIdx->nColum
23250 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  n );.      testc
23260 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
23270 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
23280 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
23290 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
232a0 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
232b0 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
232c0 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
232d0 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
232e0 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65  X, 0);.    if( e
232f0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
23300 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
23310 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
23320 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
23330 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
23340 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
23350 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
23360 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
23370 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
23380 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
23390 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
233a0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
233b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
233c0 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28  _ABLE );.    if(
233d0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
233e0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
233f0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
23400 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
23410 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
23420 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
23430 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
23440 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
23450 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
23460 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
23470 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
23480 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
23490 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234b0 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
234c0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
234d0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
234e0 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
234f0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
23500 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
23510 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
23520 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
23530 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
23540 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
23550 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
23560 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
23570 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
23580 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
23590 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
235a0 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
235b0 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
235c0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
235d0 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
235e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
235f0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
23600 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
23610 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45   }.      pIn->eE
23620 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20  ndLoopOp = bRev 
23630 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
23640 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
23650 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
23660 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29  OP_IsNull, iReg)
23670 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23680 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
23690 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
236a0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
236b0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
236c0 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
236d0 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
236e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
236f0 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
23700 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
23710 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
23720 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  n.** index..**.*
23730 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
23740 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
23750 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
23760 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
23770 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
23780 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
23790 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
237a0 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
237b0 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
237c0 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
237d0 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
237e0 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
237f0 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
23800 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
23810 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
23820 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
23830 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
23840 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
23850 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
23860 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
23870 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
23880 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
23890 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
238a0 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
238b0 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
238c0 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74  and b will be st
238d0 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65  ored.** in conse
238e0 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
238f0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f   and the index o
23900 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  f the first regi
23910 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
23920 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
23930 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
23940 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
23950 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
23960 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
23970 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
23980 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
23990 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
239a0 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
239b0 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
239c0 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
239d0 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
239e0 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
239f0 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75  ell and.** compu
23a00 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  te the affinity 
23a10 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
23a20 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  is routine alway
23a30 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c  s allocates at l
23a40 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20  east one memory 
23a50 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73  cell and returns
23a60 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
23a70 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
23a80 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  l. The code that
23a90 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
23aa0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
23ab0 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
23ac0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65   to store the te
23ad0 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79  rmination.** key
23ae0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
23af0 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d  op.  If one or m
23b00 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ore IN operators
23b10 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a   appear, then.**
23b20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
23b30 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74  locates an addit
23b40 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79  ional nEq memory
23b50 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72   cells for inter
23b60 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a  nal.** use..**.*
23b70 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
23b80 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65  ng, *pzAff is se
23b90 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
23ba0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
23bb0 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74  g a.** copy of t
23bc0 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
23bd0 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65  ty string of the
23be0 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64   index allocated
23bf0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
23c00 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63  3DbMalloc(). Exc
23c10 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20  ept, entries in 
23c20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
23c30 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65  string associate
23c40 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69  d.** with equali
23c50 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ty constraints t
23c60 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66  hat use NONE aff
23c70 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74 6f  inity are set to
23c80 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
23c90 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20  ONE. This is to 
23ca0 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75  deal with SQL su
23cb0 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch as the follow
23cc0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
23cd0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 54  ATE TABLE t1(a T
23ce0 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
23cf0 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54   b);.**   SELECT
23d00 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20   ... FROM t1 AS 
23d10 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e  t2, t1 WHERE t1.
23d20 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20  a = t2.b;.**.** 
23d30 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
23d40 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20  bove, the index 
23d50 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45 58  on t1(a) has TEX
23d60 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20  T affinity. But 
23d70 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67  since.** the rig
23d80 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht hand side of 
23d90 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
23da0 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68  straint (t2.b) h
23db0 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  as NONE affinity
23dc0 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69  ,.** no conversi
23dd0 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74  on should be att
23de0 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75 73  empted before us
23df0 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65  ing a t2.b value
23e00 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61   as part of.** a
23e10 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20 74   key to search t
23e20 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20  he index. Hence 
23e30 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69  the first byte i
23e40 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  n the returned a
23e50 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e  ffinity.** strin
23e60 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c  g in this exampl
23e70 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74  e would be set t
23e80 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  o SQLITE_AFF_NON
23e90 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
23ea0 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
23eb0 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
23ec0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
23ed0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
23ee0 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
23ef0 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20  l *pLevel,   /* 
23f00 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f  Which nested loo
23f10 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65  p of the FROM we
23f20 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20   are coding */. 
23f30 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
23f40 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
23f50 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
23f60 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
23f70 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70  ,     /* Which p
23f80 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76  arts of FROM hav
23f90 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  e not yet been c
23fa0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  oded */.  int nE
23fb0 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20  xtraReg,        
23fc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
23fd0 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ra registers to 
23fe0 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
23ff0 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20  ar **pzAff      
24000 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
24010 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69  to point to affi
24020 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
24030 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  {.  int nEq = pL
24040 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20  evel->plan.nEq; 
24050 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
24060 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
24070 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
24080 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
24090 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
240a0 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64     /* The vm und
240b0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
240c0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
240d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
240e0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
240f0 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74  being used for t
24100 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  his loop */.  in
24110 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  t iCur = pLevel-
24120 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54  >iTabCur;   /* T
24130 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
24140 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
24150 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
24160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
24170 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
24180 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a   term */.  int j
24190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
241a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
241b0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
241c0 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
241d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
241e0 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ase register */.
241f0 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24210 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
24220 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
24230 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  te */.  char *zA
24240 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
24250 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
24260 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75  y string to retu
24270 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  rn */..  /* This
24280 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20   module is only 
24290 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20  called on query 
242a0 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61  plans that use a
242b0 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73  n index. */.  as
242c0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  sert( pLevel->pl
242d0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
242e0 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20  RE_INDEXED );.  
242f0 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
24300 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f  lan.u.pIdx;..  /
24310 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
24320 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c   many memory cel
24330 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  ls we will need 
24340 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68  then allocate th
24350 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61  em..  */.  regBa
24360 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
24370 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20  m + 1;.  nReg = 
24380 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
24390 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20   + nExtraReg;.  
243a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
243b0 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20  nReg;..  zAff = 
243c0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
243d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69  pParse->db, sqli
243e0 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
243f0 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20  Str(v, pIdx));. 
24400 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20   if( !zAff ){.  
24410 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
24420 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
24430 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61    }..  /* Evalua
24440 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  te the equality 
24450 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
24460 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
24470 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b  >nColumn>=nEq );
24480 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45  .  for(j=0; j<nE
24490 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  q; j++){.    int
244a0 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d   r1;.    int k =
244b0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
244c0 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  j];.    pTerm = 
244d0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
244e0 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
244f0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
24500 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20  Flags, pIdx);.  
24510 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
24520 20 62 72 65 61 6b 3b 0a 20 20 20 20 2f 2a 20 54   break;.    /* T
24530 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75  he following tru
24540 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69  e for indices wi
24550 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  th redundant col
24560 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78  umns. .    ** Ex
24570 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  : CREATE INDEX i
24580 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20  1 ON t1(a,b,a); 
24590 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
245a0 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62   WHERE a=0 AND b
245b0 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  =0; */.    testc
245c0 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ase( (pTerm->wtF
245d0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
245e0 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  D)!=0 );.    tes
245f0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
24600 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
24610 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
24620 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
24630 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75      r1 = codeEqu
24640 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
24650 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
24660 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a   j, regBase+j);.
24670 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42      if( r1!=regB
24680 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69  ase+j ){.      i
24690 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20  f( nReg==1 ){.  
246a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
246b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
246c0 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20  se, regBase);.  
246d0 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
246e0 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r1;.      }else{
246f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24700 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24710 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42  _SCopy, r1, regB
24720 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a  ase+j);.      }.
24730 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
24740 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
24750 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
24760 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
24770 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24780 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
24790 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
247a0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53  perator & (WO_IS
247b0 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20  NULL|WO_IN))==0 
247c0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
247d0 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70  Right = pTerm->p
247e0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
247f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24800 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
24810 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
24820 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  +j, pLevel->addr
24830 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Brk);.      if( 
24840 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  zAff ){.        
24850 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
24860 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
24870 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c  t, zAff[j])==SQL
24880 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
24890 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a            zAff[j
248a0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
248b0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
248c0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
248d0 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
248e0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
248f0 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a  ht, zAff[j]) ){.
24900 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a            zAff[j
24910 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
24920 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
24930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24940 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66  .  *pzAff = zAff
24950 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61  ;.  return regBa
24960 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  se;.}..#ifndef S
24970 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
24980 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  IN./*.** This ro
24990 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65  utine is a helpe
249a0 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64  r for explainInd
249b0 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a  exRange() below.
249c0 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73  **.** pStr holds
249d0 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20   the text of an 
249e0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
249f0 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20  we are building 
24a00 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61  up one term.** a
24a10 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
24a20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e  routine adds a n
24a30 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65  ew term to the e
24a40 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  nd of the expres
24a50 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61  sion..** Terms a
24a60 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20  re separated by 
24a70 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22  AND so add the "
24a80 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65  AND" text for se
24a90 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75  cond and subsequ
24aa0 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c  ent.** terms onl
24ab0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
24ac0 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54  d explainAppendT
24ad0 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20  erm(.  StrAccum 
24ae0 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20  *pStr,          
24af0 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
24b00 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20  xpression being 
24b10 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69  built */.  int i
24b20 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
24b30 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
24b40 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46  of this term.  F
24b50 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a  irst is zero */.
24b60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
24b70 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a  olumn,        /*
24b80 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
24b90 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  umn */.  const c
24ba0 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20  har *zOp        
24bb0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
24bc0 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  the operator */.
24bd0 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29  ){.  if( iTerm )
24be0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
24bf0 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41  Append(pStr, " A
24c00 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69  ND ", 5);.  sqli
24c10 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
24c20 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c  d(pStr, zColumn,
24c30 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53   -1);.  sqlite3S
24c40 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
24c50 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73  tr, zOp, 1);.  s
24c60 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
24c70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20  pend(pStr, "?", 
24c80 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  1);.}../*.** Arg
24c90 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73  ument pLevel des
24ca0 63 72 69 62 65 73 20 61 20 73 74 72 61 74 65 67  cribes a strateg
24cb0 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  y for scanning t
24cc0 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20  able pTab. This 
24cd0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
24ce0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
24cf0 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
24d00 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64  r containing a d
24d10 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66  escription.** of
24d20 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74   the subset of t
24d30 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65  able rows scanne
24d40 64 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67  d by the strateg
24d50 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66  y in the form of
24d60 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65   an.** SQL expre
24d70 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c  ssion. Or, if al
24d80 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e  l rows are scann
24d90 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
24da0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  rned..**.** For 
24db0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
24dc0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  query:.**.**   S
24dd0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
24de0 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e  WHERE a=1 AND b>
24df0 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20  2;.**.** is run 
24e00 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20  and there is an 
24e10 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c  index on (a, b),
24e20 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
24e30 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a  ion returns a.**
24e40 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20   string similar 
24e50 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f  to:.**.**   "a=?
24e60 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20   AND b>?".**.** 
24e70 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69  The returned poi
24e80 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d  nter points to m
24e90 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
24ea0 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
24eb0 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20  loc()..** It is 
24ec0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
24ed0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
24ee0 20 74 6f 20 66 72 65 65 20 74 68 65 20 62 75 66   to free the buf
24ef0 66 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  fer when it is.*
24f00 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  * no longer requ
24f10 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
24f20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64  char *explainInd
24f30 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20  exRange(sqlite3 
24f40 2a 64 62 2c 20 57 68 65 72 65 4c 65 76 65 6c 20  *db, WhereLevel 
24f50 2a 70 4c 65 76 65 6c 2c 20 54 61 62 6c 65 20 2a  *pLevel, Table *
24f60 70 54 61 62 29 7b 0a 20 20 57 68 65 72 65 50 6c  pTab){.  WherePl
24f70 61 6e 20 2a 70 50 6c 61 6e 20 3d 20 26 70 4c 65  an *pPlan = &pLe
24f80 76 65 6c 2d 3e 70 6c 61 6e 3b 0a 20 20 49 6e 64  vel->plan;.  Ind
24f90 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 50 6c  ex *pIndex = pPl
24fa0 61 6e 2d 3e 75 2e 70 49 64 78 3b 0a 20 20 69 6e  an->u.pIdx;.  in
24fb0 74 20 6e 45 71 20 3d 20 70 50 6c 61 6e 2d 3e 6e  t nEq = pPlan->n
24fc0 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  Eq;.  int i, j;.
24fd0 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d    Column *aCol =
24fe0 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69   pTab->aCol;.  i
24ff0 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70  nt *aiColumn = p
25000 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b  Index->aiColumn;
25010 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b  .  StrAccum txt;
25020 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26  ..  if( nEq==0 &
25030 26 20 28 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67  & (pPlan->wsFlag
25040 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c  s & (WHERE_BTM_L
25050 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
25060 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20  IMIT))==0 ){.   
25070 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
25080 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
25090 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c  Init(&txt, 0, 0,
250a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
250b0 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20  TH);.  txt.db = 
250c0 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  db;.  sqlite3Str
250d0 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
250e0 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f  , " (", 2);.  fo
250f0 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b  r(i=0; i<nEq; i+
25100 2b 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  +){.    explainA
25110 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
25120 69 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e  i, aCol[aiColumn
25130 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29  [i]].zName, "=")
25140 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a  ;.  }..  j = i;.
25150 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46    if( pPlan->wsF
25160 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
25170 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72  IMIT ){.    char
25180 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78   *z = (j==pIndex
25190 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72  ->nColumn ) ? "r
251a0 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43  owid" : aCol[aiC
251b0 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
251c0 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
251d0 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b  ndTerm(&txt, i++
251e0 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20  , z, ">");.  }. 
251f0 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c   if( pPlan->wsFl
25200 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ags&WHERE_TOP_LI
25210 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
25220 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d  *z = (j==pIndex-
25230 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f  >nColumn ) ? "ro
25240 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
25250 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
25260 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
25270 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a  dTerm(&txt, i, z
25280 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71  , "<");.  }.  sq
25290 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
252a0 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31  end(&txt, ")", 1
252b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
252c0 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
252d0 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  h(&txt);.}../*.*
252e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
252f0 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
25300 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  s currently proc
25310 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49  essing an EXPLAI
25320 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20  N QUERY PLAN.** 
25330 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20  command. If the 
25340 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70  query being comp
25350 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41  iled is an EXPLA
25360 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61  IN QUERY PLAN, a
25370 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72   single.** recor
25380 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  d is added to th
25390 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63  e output to desc
253a0 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73  ribe the table s
253b0 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20  can strategy in 
253c0 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73  .** pLevel..*/.s
253d0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
253e0 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72  inOneScan(.  Par
253f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25410 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
25420 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
25430 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
25440 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74     /* Table list
25450 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72   this loop refer
25460 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c  s to */.  WhereL
25470 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
25480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61            /* Sca
25490 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78  n to write OP_Ex
254a0 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72  plain opcode for
254b0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
254c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
254d0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
254e0 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d  or "level" colum
254f0 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
25500 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25520 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66   /* Value for "f
25530 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f  rom" column of o
25540 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77  utput */.  u16 w
25550 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
25560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
25570 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71  ags passed to sq
25580 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
25590 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  ) */.){.  if( pP
255a0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
255b0 20 29 7b 0a 20 20 20 20 75 33 32 20 66 6c 61 67   ){.    u32 flag
255c0 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  s = pLevel->plan
255d0 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 73 74  .wsFlags;.    st
255e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
255f0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
25600 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
25610 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65  iFrom];.    Vdbe
25620 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
25630 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20  dbe;      /* VM 
25640 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
25650 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
25660 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
25670 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61  b;     /* Databa
25680 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  se handle */.   
25690 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20   char *zMsg;    
256a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
256b0 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f  * Text to add to
256c0 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20   EQP output */. 
256d0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
256e0 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
256f0 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d   /* Expected num
25700 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
25710 74 65 64 20 62 79 20 73 63 61 6e 20 2a 2f 0a 20  ted by scan */. 
25720 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61     int iId = pPa
25730 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20  rse->iSelectId; 
25740 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c   /* Select id (l
25750 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20  eft-most output 
25760 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69  column) */.    i
25770 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20  nt isSearch;    
25780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25790 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43  True for a SEARC
257a0 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41  H. False for SCA
257b0 4e 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 28  N. */..    if( (
257c0 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54  flags&WHERE_MULT
257d0 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46  I_OR) || (wctrlF
257e0 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41  lags&WHERE_ONETA
257f0 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75  BLE_ONLY) ) retu
25800 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63  rn;..    isSearc
25810 68 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  h = (pLevel->pla
25820 6e 2e 6e 45 71 3e 30 29 0a 20 20 20 20 20 20 20  n.nEq>0).       
25830 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
25840 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
25850 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
25860 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
25870 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67     || (wctrlFlag
25880 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59  s&(WHERE_ORDERBY
25890 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52  _MIN|WHERE_ORDER
258a0 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a  BY_MAX));..    z
258b0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
258c0 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69  intf(db, "%s", i
258d0 73 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22  sSearch?"SEARCH"
258e0 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66  :"SCAN");.    if
258f0 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
25900 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
25910 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
25920 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53  (db, zMsg, "%s S
25930 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73  UBQUERY %d", zMs
25940 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  g,pItem->iSelect
25950 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Id);.    }else{.
25960 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
25970 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
25980 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45   zMsg, "%s TABLE
25990 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
259a0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  m->zName);.    }
259b0 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
259c0 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
259d0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
259e0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
259f0 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d  , "%s AS %s", zM
25a00 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  sg, pItem->zAlia
25a10 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
25a20 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
25a30 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
25a40 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65        char *zWhe
25a50 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65  re = explainInde
25a60 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 65 76 65  xRange(db, pLeve
25a70 6c 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  l, pItem->pTab);
25a80 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
25a90 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
25aa0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e  , zMsg, "%s USIN
25ab0 47 20 25 73 25 73 49 4e 44 45 58 25 73 25 73 25  G %s%sINDEX%s%s%
25ac0 73 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20  s", zMsg, .     
25ad0 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
25ae0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
25af0 3f 22 41 55 54 4f 4d 41 54 49 43 20 22 3a 22 22  ?"AUTOMATIC ":""
25b00 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  ),.          ((f
25b10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
25b20 5f 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47  _ONLY)?"COVERING
25b30 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20   ":""),.        
25b40 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
25b50 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22  E_TEMP_INDEX)?""
25b60 3a 22 20 22 29 2c 0a 20 20 20 20 20 20 20 20 20  :" "),.         
25b70 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
25b80 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a  _TEMP_INDEX)?"":
25b90 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
25ba0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20  pIdx->zName),.  
25bb0 20 20 20 20 20 20 20 20 7a 57 68 65 72 65 0a 20          zWhere. 
25bc0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
25bd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25be0 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c  zWhere);.    }el
25bf0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 28  se if( flags & (
25c00 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
25c10 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
25c20 29 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  ) ){.      zMsg 
25c30 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
25c40 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
25c50 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
25c60 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67  IMARY KEY", zMsg
25c70 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c  );..      if( fl
25c80 61 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f  ags&WHERE_ROWID_
25c90 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  EQ ){.        zM
25ca0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
25cb0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
25cc0 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a  %s (rowid=?)", z
25cd0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
25ce0 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45  e if( (flags&WHE
25cf0 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d  RE_BOTH_LIMIT)==
25d00 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54  WHERE_BOTH_LIMIT
25d10 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
25d20 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
25d30 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
25d40 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f   (rowid>? AND ro
25d50 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid<?)", zMsg);.
25d60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
25d70 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f  flags&WHERE_BTM_
25d80 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
25d90 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
25da0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
25db0 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22  , "%s (rowid>?)"
25dc0 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
25dd0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57  else if( flags&W
25de0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
25df0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
25e00 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
25e10 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
25e20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
25e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25e40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25e50 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
25e60 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66  .    else if( (f
25e70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
25e80 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
25e90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
25ea0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62  ndex_info *pVtab
25eb0 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
25ec0 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20  an.u.pVtabIdx;. 
25ed0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
25ee0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
25ef0 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41  zMsg, "%s VIRTUA
25f00 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64  L TABLE INDEX %d
25f10 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20  :%s", zMsg,.    
25f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
25f30 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  tabIdx->idxNum, 
25f40 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72  pVtabIdx->idxStr
25f50 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
25f60 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
25f70 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42  gs&(WHERE_ORDERB
25f80 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45  Y_MIN|WHERE_ORDE
25f90 52 42 59 5f 4d 41 58 29 20 29 7b 0a 20 20 20 20  RBY_MAX) ){.    
25fa0 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
25fb0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
25fc0 52 44 45 52 42 59 5f 4d 49 4e 20 29 3b 0a 20 20  RDERBY_MIN );.  
25fd0 20 20 20 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20      nRow = 1;.  
25fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
25ff0 52 6f 77 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  Row = (sqlite3_i
26000 6e 74 36 34 29 70 4c 65 76 65 6c 2d 3e 70 6c 61  nt64)pLevel->pla
26010 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 20 20  n.nRow;.    }.  
26020 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
26030 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
26040 67 2c 20 22 25 73 20 28 7e 25 6c 6c 64 20 72 6f  g, "%s (~%lld ro
26050 77 73 29 22 2c 20 7a 4d 73 67 2c 20 6e 52 6f 77  ws)", zMsg, nRow
26060 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
26070 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
26080 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65  xplain, iId, iLe
26090 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67  vel, iFrom, zMsg
260a0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
260b0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
260c0 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  ine explainOneSc
260d0 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a  an(u,v,w,x,y,z).
260e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
260f0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
26100 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
26110 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73  e code for the s
26120 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76  tart of the iLev
26130 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68  el-th loop in th
26140 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
26150 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
26160 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57   described by pW
26170 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
26180 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c  Bitmask codeOneL
26190 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72  oopStart(.  Wher
261a0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
261b0 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66   /* Complete inf
261c0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
261d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
261e0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
261f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
26200 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e  ch level of pWIn
26210 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62  fo->a[] should b
26220 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36  e coded */.  u16
26230 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
26240 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
26250 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
26260 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
26270 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  nt.h */.  Bitmas
26280 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f  k notReady     /
26290 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61  * Which tables a
262a0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  re currently ava
262b0 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  ilable */.){.  i
262c0 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  nt j, k;        
262d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
262e0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
262f0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
26300 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
26310 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
26320 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74  */.  int addrNxt
26330 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  ;         /* Whe
26340 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f  re to jump to co
26350 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
26360 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a  next IN case */.
26370 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b    int omitTable;
26380 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
26390 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64  f we use the ind
263a0 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ex only */.  int
263b0 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
263c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
263d0 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20  need to scan in 
263e0 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
263f0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
26400 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77  Level;  /* The w
26410 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65  here level to be
26420 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
26430 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
26440 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
26450 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
26460 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
26470 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
26480 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
26490 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61    /* A WHERE cla
264a0 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61  use term */.  Pa
264b0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
264c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
264d0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
264e0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26500 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
26510 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72  pared stmt under
26520 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a   constructions *
26530 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
26540 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
26550 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
26560 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f  se term being co
26570 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ded */.  int add
26580 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  rBrk;           
26590 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
265a0 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
265b0 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  ut of the loop *
265c0 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
265d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
265e0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
265f0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
26600 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  h next cycle */.
26610 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20    int iRowidReg 
26620 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  = 0;        /* R
26630 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69  owid is stored i
26640 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c  n this register,
26650 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a   if not zero */.
26660 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65    int iReleaseRe
26670 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  g = 0;      /* T
26680 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20  emp register to 
26690 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75  free before retu
266a0 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72  rning */..  pPar
266b0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
266c0 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  rse;.  v = pPars
266d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20  e->pVdbe;.  pWC 
266e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20  = pWInfo->pWC;. 
266f0 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
26700 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20  o->a[iLevel];.  
26710 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e  pTabItem = &pWIn
26720 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
26730 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
26740 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65    iCur = pTabIte
26750 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52  m->iCursor;.  bR
26760 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  ev = (pLevel->pl
26770 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
26780 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a  RE_REVERSE)!=0;.
26790 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70    omitTable = (p
267a0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
267b0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
267c0 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20  ONLY)!=0 .      
267d0 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
267e0 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
267f0 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20  E_TABLE)==0;..  
26800 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
26810 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
26820 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
26830 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a  instructions.  *
26840 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
26850 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
26860 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61   addrBrk to brea
26870 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  k out of a loop.
26880 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f  .  ** Jump to co
26890 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
268a0 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
268b0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
268c0 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a  e.  ** loop..  *
268d0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72  *.  ** When ther
268e0 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
268f0 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76  tor, we also hav
26900 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61  e a "addrNxt" la
26910 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65  bel that.  ** me
26920 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
26930 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
26940 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
26950 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74  on.  When.  ** t
26960 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f  here are no IN o
26970 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
26980 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
26990 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
269a0 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  .  ** is the sam
269b0 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a  e as "addrBrk"..
269c0 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d    */.  addrBrk =
269d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
269e0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
269f0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
26a00 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
26a10 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65  addrCont = pLeve
26a20 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  l->addrCont = sq
26a30 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
26a40 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  el(v);..  /* If 
26a50 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
26a60 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
26a70 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
26a80 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20  locate and.  ** 
26a90 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
26aa0 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
26ab0 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
26ac0 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
26ad0 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
26ae0 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
26af0 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  e join..  */.  i
26b00 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
26b10 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
26b20 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  0].jointype & JT
26b30 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
26b40 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
26b50 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  in = ++pParse->n
26b60 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
26b70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26b80 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65  _Integer, 0, pLe
26b90 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
26ba0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
26bb0 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
26bc0 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
26bd0 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ag"));.  }..  /*
26be0 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   Special case of
26bf0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73   a FROM clause s
26c00 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e  ubquery implemen
26c10 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
26c20 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ine */.  if( pTa
26c30 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  bItem->viaCorout
26c40 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
26c50 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
26c60 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
26c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26c80 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
26c90 65 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64  er, pTabItem->ad
26ca0 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67  drFillSub-1, reg
26cb0 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76  Yield);.    pLev
26cc0 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65  el->p2 =  sqlite
26cd0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
26ce0 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
26cf0 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  d);.    VdbeComm
26d00 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f  ent((v, "next ro
26d10 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20  w of co-routine 
26d20 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  %s", pTabItem->p
26d30 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
26d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26d50 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
26d60 67 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72  gYield+1, addrBr
26d70 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
26d80 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20  op = OP_Goto;.  
26d90 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
26da0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
26db0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28  ALTABLE.  if(  (
26dc0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
26dd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
26de0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
26df0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20  .    /* Case 0: 
26e00 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   The table is a 
26e10 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20  virtual-table.  
26e20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20  Use the VFilter 
26e30 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a  and VNext.    **
26e40 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63            to acc
26e50 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20  ess the data..  
26e60 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65    */.    int iRe
26e70 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65  g;   /* P3 Value
26e80 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20   for OP_VFilter 
26e90 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  */.    int addrN
26ea0 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 73 71 6c  otFound;.    sql
26eb0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
26ec0 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
26ed0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
26ee0 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  Idx;.    int nCo
26ef0 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62  nstraint = pVtab
26f00 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  Idx->nConstraint
26f10 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71 6c  ;.    struct sql
26f20 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
26f30 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73  raint_usage *aUs
26f40 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f70 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
26f80 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
26f90 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75  ;.    const stru
26fa0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
26fb0 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f  _constraint *aCo
26fc0 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20  nstraint =.     
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ff0 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
27000 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
27010 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ;..    sqlite3Ex
27020 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
27030 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  se);.    iReg = 
27040 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
27050 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e  nge(pParse, nCon
27060 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
27070 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70  addrNotFound = p
27080 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a  Level->addrBrk;.
27090 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d      for(j=1; j<=
270a0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b  nConstraint; j++
270b0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  ){.      for(k=0
270c0 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; k<nConstraint;
270d0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   k++){.        i
270e0 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67  f( aUsage[k].arg
270f0 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20  vIndex==j ){.   
27100 20 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67         int iTarg
27110 65 74 20 3d 20 69 52 65 67 2b 6a 2b 31 3b 0a 20  et = iReg+j+1;. 
27120 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d           pTerm =
27130 20 26 70 57 43 2d 3e 61 5b 61 43 6f 6e 73 74 72   &pWC->a[aConstr
27140 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66  aint[k].iTermOff
27150 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  set];.          
27160 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
27170 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a  ator & WO_IN ){.
27180 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 64 65              code
27190 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
271a0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
271b0 65 6c 2c 20 6b 2c 20 69 54 61 72 67 65 74 29 3b  el, k, iTarget);
271c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
271d0 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76  rNotFound = pLev
271e0 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
271f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27200 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27210 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
27220 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  , pTerm->pExpr->
27230 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29  pRight, iTarget)
27240 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27250 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
27260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27270 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43  .      if( k==nC
27280 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65 61  onstraint ) brea
27290 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  k;.    }.    sql
272a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
272b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 56  , OP_Integer, pV
272c0 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  tabIdx->idxNum, 
272d0 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  iReg);.    sqlit
272e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
272f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c  OP_Integer, j-1,
27300 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
27310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
27320 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
27330 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
27340 64 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49 64  d, iReg, pVtabId
27350 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20  x->idxStr,.     
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27370 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54   pVtabIdx->needT
27380 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20 50 34  oFreeIdxStr ? P4
27390 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54  _MPRINTF : P4_ST
273a0 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61 62  ATIC);.    pVtab
273b0 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
273c0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 66  dxStr = 0;.    f
273d0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
273e0 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
273f0 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d     if( aUsage[j]
27400 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  .omit ){.       
27410 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
27420 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72  nstraint[j].iTer
27430 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
27440 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
27450 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65  vel, &pWC->a[iTe
27460 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rm]);.      }.  
27470 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
27480 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
27490 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
274a0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
274b0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
274c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
274d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
274e0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
274f0 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
27500 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
27510 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27520 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
27530 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
27540 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
27550 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
27560 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
27570 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
27580 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20  E_ROWID_EQ ){.  
27590 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65    /* Case 1:  We
275a0 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
275b0 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
275c0 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
275d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
275e0 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
275f0 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
27600 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
27610 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
27620 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
27630 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
27640 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
27650 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  )".    **       
27660 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
27670 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61 73    */.    iReleas
27680 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  eReg = sqlite3Ge
27690 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
276a0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  ;.    pTerm = fi
276b0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
276c0 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
276d0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
276e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
276f0 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
27700 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
27710 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
27720 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
27730 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
27740 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
27750 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
27760 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
27770 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69  5-11662 */.    i
27780 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45  RowidReg = codeE
27790 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
277a0 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
277b0 6c 2c 20 30 2c 20 69 52 65 6c 65 61 73 65 52 65  l, 0, iReleaseRe
277c0 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  g);.    addrNxt 
277d0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
277e0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
277f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
27800 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64  ustBeInt, iRowid
27810 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  Reg, addrNxt);. 
27820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27830 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
27840 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72  ists, iCur, addr
27850 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Nxt, iRowidReg);
27860 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
27870 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
27880 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77  nge(pParse, iRow
27890 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73  idReg, 1);.    s
278a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
278b0 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
278c0 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
278d0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
278e0 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
278f0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
27900 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  OP_Noop;.  }else
27910 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
27920 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
27930 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b  E_ROWID_RANGE ){
27940 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
27950 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
27960 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
27970 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
27980 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
27990 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
279a0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
279b0 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
279c0 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
279d0 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
279e0 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
279f0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
27a00 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
27a10 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64     pStart = find
27a20 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
27a30 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
27a40 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
27a50 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65     pEnd = findTe
27a60 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
27a70 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
27a80 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20  T|WO_LE, 0);.   
27a90 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
27aa0 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72     pTerm = pStar
27ab0 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20  t;.      pStart 
27ac0 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45  = pEnd;.      pE
27ad0 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  nd = pTerm;.    
27ae0 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  }.    if( pStart
27af0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
27b00 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
27b10 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
27b20 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  n that defines t
27b30 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a  he start bound *
27b40 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20  /.      int r1, 
27b50 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a  rTemp;        /*
27b60 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68   Registers for h
27b70 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74  olding the start
27b80 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20   boundary */..  
27b90 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
27ba0 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61  wing constant ma
27bb0 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69  ps TK_xx codes i
27bc0 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  nto correspondin
27bd0 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b  g .      ** seek
27be0 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65   opcodes.  It de
27bf0 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69  pends on a parti
27c00 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f  cular ordering o
27c10 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f  f TK_xx.      */
27c20 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
27c30 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aMoveOp[] = {.  
27c40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
27c50 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c  T */  OP_SeekGt,
27c60 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
27c70 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LE */  OP_Seek
27c80 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Le,.           /
27c90 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53  * TK_LT */  OP_S
27ca0 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20  eekLt,.         
27cb0 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f    /* TK_GE */  O
27cc0 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d  P_SeekGe.      }
27cd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27ce0 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29  TK_LE==TK_GT+1 )
27cf0 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;      /* Make s
27d00 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67  ure the ordering
27d10 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
27d20 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
27d30 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +2 );      /*  .
27d40 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20  .. of the TK_xx 
27d50 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20  values... */.   
27d60 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
27d70 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20  ==TK_GT+3 );    
27d80 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72    /*  ... is cor
27d90 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20  recct. */..     
27da0 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
27db0 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
27dc0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
27dd0 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
27de0 32 20 2a 2f 0a 20 20 20 20 20 20 70 58 20 3d 20  2 */.      pX = 
27df0 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
27e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
27e10 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
27e20 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  rt( pStart->left
27e30 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
27e40 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
27e50 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
27e60 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
27e70 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
27e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27e90 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
27ea0 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
27eb0 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
27ec0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
27ed0 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
27ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27ef0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
27f00 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
27f10 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
27f20 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
27f30 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
27f40 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
27f50 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
27f60 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
27f70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27f80 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
27f90 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
27fa0 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
27fb0 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Brk);.    }.    
27fc0 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
27fd0 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
27fe0 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
27ff0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
28000 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
28010 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c   assert( pEnd->l
28020 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
28030 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28040 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
28050 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
28060 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
28070 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20  5-11662 */.     
28080 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b   memEndValue = +
28090 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
280a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
280b0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
280c0 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
280d0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
280e0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
280f0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
28100 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
28110 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
28120 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
28130 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
28140 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
28150 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
28160 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61      }.      disa
28170 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
28180 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pEnd);.    }.   
28190 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
281a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
281b0 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
281c0 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
281d0 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
281e0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
281f0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
28200 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
28210 20 20 69 66 28 20 70 53 74 61 72 74 3d 3d 30 20    if( pStart==0 
28220 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20  && pEnd==0 ){.  
28230 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
28240 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
28250 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
28260 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28270 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
28280 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
28290 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f 70  }.    if( testOp
282a0 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
282b0 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69     iRowidReg = i
282c0 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
282d0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
282e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
282f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28300 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
28310 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
28320 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28330 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
28340 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
28350 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
28360 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
28370 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45  (v, testOp, memE
28380 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b  ndValue, addrBrk
28390 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
283a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
283b0 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
283c0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20  E_AFF_NUMERIC | 
283d0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
283e0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  L);.    }.  }els
283f0 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  e if( pLevel->pl
28400 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
28410 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
28420 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
28430 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  ) ){.    /* Case
28440 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   3: A scan using
28450 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
28460 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
28470 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
28480 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
28490 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
284a0 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
284b0 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
284c0 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
284d0 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
284e0 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
284f0 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
28500 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
28510 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
28520 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
28530 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
28540 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
28550 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
28560 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
28570 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
28580 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
28590 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
285a0 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
285b0 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
285c0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
285d0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
285e0 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
285f0 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
28600 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
28610 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
28620 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
28630 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
28640 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
28650 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
28660 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
28670 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
28680 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
28690 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
286a0 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
286b0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
286c0 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
286d0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
286e0 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
286f0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
28700 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
28710 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
28720 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
28730 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
28740 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
28750 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
28760 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
28770 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
28780 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
28790 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
287a0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
287b0 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
287c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
287d0 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
287e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
287f0 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
28800 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
28810 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
28820 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
28830 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
28840 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
28850 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
28860 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
28870 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
28880 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
28890 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
288a0 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
288b0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
288c0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
288d0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
288e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
288f0 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
28900 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
28910 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
28920 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
28930 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
28940 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
28950 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
28960 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
28970 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
28980 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
28990 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
289a0 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
289b0 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
289c0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
289d0 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
289e0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
289f0 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
28a00 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
28a10 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
28a20 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
28a30 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
28a40 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20  ekGt,           
28a50 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
28a60 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
28a70 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
28a80 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
28a90 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Lt,           /*
28aa0 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
28ab0 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
28ac0 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
28ad0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65  .      OP_SeekGe
28ae0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
28af0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
28b00 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
28b10 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
28b20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20       OP_SeekLe  
28b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
28b40 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
28b50 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
28b60 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
28b70 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
28b80 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
28b90 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f   = {.      OP_No
28ba0 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
28bb0 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
28bc0 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
28bd0 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
28be0 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
28bf0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
28c00 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
28c10 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20   OP_IdxLT       
28c20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64        /* 2: (end
28c30 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
28c40 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
28c50 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c      int nEq = pL
28c60 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20  evel->plan.nEq; 
28c70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
28c80 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a   or IN terms */.
28c90 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65      int isMinQue
28ca0 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
28cb0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
28cc0 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45  n optimized SELE
28cd0 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20  CT min(x).. */. 
28ce0 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20     int regBase; 
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
28d10 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61   holding constra
28d20 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  int values */.  
28d30 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20    int r1;       
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d50 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
28d60 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
28d70 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
28d80 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
28d90 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
28da0 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
28db0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
28dc0 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
28dd0 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
28de0 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
28df0 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
28e00 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
28e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28e20 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
28e30 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
28e40 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
28e50 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
28e60 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28e70 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
28e80 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
28e90 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
28ea0 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
28eb0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
28ec0 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
28ed0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
28ee0 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
28ef0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28f00 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
28f10 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
28f20 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
28f30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28f40 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
28f50 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
28f60 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
28f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28f80 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
28f90 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
28fa0 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
28fb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
28fc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
28fd0 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
28fe0 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
28ff0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
29000 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
29010 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
29020 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
29030 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
29040 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
29050 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
29060 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
29070 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66     char *zEndAff
29080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29090 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
290a0 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
290b0 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20  straint */..    
290c0 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
290d0 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
290e0 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
290f0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 6b  ->iIdxCur;.    k
29100 20 3d 20 28 6e 45 71 3d 3d 70 49 64 78 2d 3e 6e   = (nEq==pIdx->n
29110 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 49  Column ? -1 : pI
29120 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  dx->aiColumn[nEq
29130 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ]);..    /* If t
29140 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
29150 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
29160 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
29170 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20  st that .    ** 
29180 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
29190 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
291a0 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
291b0 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
291c0 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68      ** query, th
291d0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  en the caller wi
291e0 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68  ll only allow th
291f0 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f  e loop to run fo
29200 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c  r.    ** a singl
29210 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
29220 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
29230 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
29240 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  ned.    ** shoul
29250 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
29260 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
29270 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
29280 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74   'x' is.    ** t
29290 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74  he first one aft
292a0 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  er the nEq equal
292b0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
292c0 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
292d0 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72    ** this requir
292e0 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  es some special 
292f0 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
29300 0a 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46  .    if( (wctrlF
29310 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
29320 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
29330 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  && (pLevel->plan
29340 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  .wsFlags&WHERE_O
29350 52 44 45 52 45 44 29 0a 20 20 20 20 20 26 26 20  RDERED).     && 
29360 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
29370 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
29380 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
29390 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
293a0 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73  ; */.      /* as
293b0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
293c0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
293d0 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
293e0 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20  umn[nEq] ); */. 
293f0 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20       isMinQuery 
29400 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
29410 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
29420 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
29430 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
29440 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
29450 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
29460 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
29470 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
29480 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
29490 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
294a0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
294b0 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
294c0 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
294d0 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
294e0 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f  eady, (WO_LT|WO_
294f0 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  LE), pIdx);.    
29500 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
29510 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29520 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
29530 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
29540 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
29550 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66 69 6e  RangeStart = fin
29560 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
29570 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57   k, notReady, (W
29580 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64  O_GT|WO_GE), pId
29590 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  x);.      nExtra
295a0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
295b0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
295c0 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
295d0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
295e0 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
295f0 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20  r IN.    ** and 
29600 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
29610 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
29620 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
29630 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
29640 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42  starting at regB
29650 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
29660 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c  regBase = codeAl
29670 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
29680 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
29690 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74  pLevel, pWC, not
296a0 52 65 61 64 79 2c 20 6e 45 78 74 72 61 52 65 67  Ready, nExtraReg
296b0 2c 20 26 7a 53 74 61 72 74 41 66 66 0a 20 20 20  , &zStartAff.   
296c0 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20   );.    zEndAff 
296d0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
296e0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53  p(pParse->db, zS
296f0 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61 64  tartAff);.    ad
29700 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
29710 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a  addrNxt;..    /*
29720 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
29730 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72   a reverse order
29740 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65   scan on an asce
29750 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a  nding index, or.
29760 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64      ** a forward
29770 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
29780 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
29790 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74  x, interchange t
297a0 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  he .    ** start
297b0 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28   and end terms (
297c0 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20  pRangeStart and 
297d0 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20  pRangeEnd)..    
297e0 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c  */.    if( (nEq<
297f0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26  pIdx->nColumn &&
29800 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53   bRev==(pIdx->aS
29810 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
29820 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20  QLITE_SO_ASC)). 
29830 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20      || (bRev && 
29840 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e  pIdx->nColumn==n
29850 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
29860 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20   SWAP(WhereTerm 
29870 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52  *, pRangeEnd, pR
29880 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
29890 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  }..    testcase(
298a0 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
298b0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
298c0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29  erator & WO_LE )
298d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
298e0 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70  pRangeStart && p
298f0 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
29900 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b  rator & WO_GE );
29910 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
29920 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
29930 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
29940 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
29950 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
29960 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64  End && pRangeEnd
29970 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
29980 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61 72 74  _GE );.    start
29990 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72  Eq = !pRangeStar
299a0 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74  t || pRangeStart
299b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
299c0 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
299d0 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e   endEq =   !pRan
299e0 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45  geEnd || pRangeE
299f0 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
29a00 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
29a10 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
29a20 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61  ints = pRangeSta
29a30 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20  rt || nEq>0;..  
29a40 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e    /* Seek the in
29a50 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68  dex cursor to th
29a60 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
29a70 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f  ange. */.    nCo
29a80 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
29a90 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74      if( pRangeSt
29aa0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
29ab0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
29ac0 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e  geStart->pExpr->
29ad0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
29ae0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
29af0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
29b00 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
29b10 20 20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61    if( (pRangeSta
29b20 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
29b30 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
29b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29b50 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
29b60 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67  p(v, pRight, reg
29b70 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
29b80 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
29b90 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20    if( zStartAff 
29ba0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
29bb0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
29bc0 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53  inity(pRight, zS
29bd0 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53  tartAff[nEq])==S
29be0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b  QLITE_AFF_NONE){
29bf0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  .          /* Si
29c00 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  nce the comparis
29c10 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66  on is to be perf
29c20 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f  ormed with no co
29c30 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20  nversions.      
29c40 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74      ** applied t
29c50 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20  o the operands, 
29c60 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  set the affinity
29c70 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69   to apply to pRi
29c80 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ght to .        
29c90 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    ** SQLITE_AFF_
29ca0 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20  NONE.  */.      
29cb0 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45      zStartAff[nE
29cc0 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
29cd0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
29ce0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
29cf0 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
29d00 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
29d10 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
29d20 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Eq]) ){.        
29d30 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
29d40 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
29d50 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
29d60 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43      }  .      nC
29d70 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
29d80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
29d90 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
29da0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
29db0 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
29dc0 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
29dd0 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51  }else if( isMinQ
29de0 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  uery ){.      sq
29df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
29e00 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
29e10 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
29e20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
29e30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20  ;.      startEq 
29e40 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74  = 0;.      start
29e50 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31  _constraints = 1
29e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65  ;.    }.    code
29e70 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
29e80 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
29e90 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61  Constraint, zSta
29ea0 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d  rtAff);.    op =
29eb0 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74   aStartOp[(start
29ec0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29  _constraints<<2)
29ed0 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20   + (startEq<<1) 
29ee0 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73  + bRev];.    ass
29ef0 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20  ert( op!=0 );.  
29f00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
29f10 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20  OP_Rewind );.   
29f20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
29f30 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65  P_Last );.    te
29f40 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
29f50 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73  eekGt );.    tes
29f60 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
29f70 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74  ekGe );.    test
29f80 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
29f90 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kLe );.    testc
29fa0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
29fb0 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Lt );.    sqlite
29fc0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
29fd0 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
29fe0 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
29ff0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a   nConstraint);..
2a000 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
2a010 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e  value for the in
2a020 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
2a030 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  int at the end o
2a040 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e  f the.    ** ran
2a050 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ge (if any)..   
2a060 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
2a070 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
2a080 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a  f( pRangeEnd ){.
2a090 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
2a0a0 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ht = pRangeEnd->
2a0b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
2a0c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2a0d0 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
2a0e0 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  se, regBase+nEq,
2a0f0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
2a100 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2a110 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  e, pRight, regBa
2a120 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69  se+nEq);.      i
2a130 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77  f( (pRangeEnd->w
2a140 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
2a150 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
2a160 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2a170 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
2a180 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
2a190 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
2a1a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a1b0 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20   zEndAff ){.    
2a1c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
2a1d0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
2a1e0 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e  Right, zEndAff[n
2a1f0 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
2a200 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
2a210 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
2a220 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
2a230 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
2a240 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
2a250 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
2a260 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
2a270 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
2a280 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
2a290 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
2a2a0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
2a2b0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
2a2c0 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
2a2d0 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
2a2e0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
2a2f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2a300 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
2a310 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
2a320 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66  e(pRight, zEndAf
2a330 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
2a340 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71       zEndAff[nEq
2a350 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
2a360 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
2a370 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63       }  .      c
2a380 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
2a390 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
2a3a0 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66  , nEq+1, zEndAff
2a3b0 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
2a3c0 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
2a3d0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
2a3e0 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
2a3f0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
2a400 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
2a410 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73  2 */.    }.    s
2a420 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
2a430 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41  rse->db, zStartA
2a440 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ff);.    sqlite3
2a450 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
2a460 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20  b, zEndAff);..  
2a470 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
2a480 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
2a490 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
2a4a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2a4b0 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  Addr(v);..    /*
2a4c0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   Check if the in
2a4d0 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61  dex cursor is pa
2a4e0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2a4f0 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
2a500 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61  op = aEndOp[(pRa
2a510 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a  ngeEnd || nEq) *
2a520 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20   (1 + bRev)];.  
2a530 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
2a540 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74  OP_Noop );.    t
2a550 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
2a560 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73  IdxGE );.    tes
2a570 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
2a580 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  xLT );.    if( o
2a590 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
2a5a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a5b0 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
2a5c0 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
2a5d0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
2a5e0 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  traint);.      s
2a5f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2a600 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65  P5(v, endEq!=bRe
2a610 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a  v ?1:0);.    }..
2a620 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2a630 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
2a640 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63  onstraints, chec
2a650 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
2a660 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  .    ** of the t
2a670 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74  able column that
2a680 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
2a690 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74  contrains is not
2a6a0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66   NULL..    ** If
2a6b0 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20   it is, jump to 
2a6c0 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
2a6d0 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  on of the loop..
2a6e0 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20      */.    r1 = 
2a6f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2a700 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74  g(pParse);.    t
2a710 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
2a720 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2a730 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
2a740 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2a750 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
2a760 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
2a770 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69  P_LIMIT );.    i
2a780 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
2a790 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
2a7a0 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
2a7b0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30  E_TOP_LIMIT))!=0
2a7c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2a7d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2a7e0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
2a7f0 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20  r, nEq, r1);.   
2a800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a810 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
2a820 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29  l, r1, addrCont)
2a830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2a840 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2a850 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a  g(pParse, r1);..
2a860 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
2a870 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66  table cursor, if
2a880 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
2a890 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
2a8a0 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
2a8b0 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  );.    disableTe
2a8c0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
2a8d0 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 21  eEnd);.    if( !
2a8e0 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  omitTable ){.   
2a8f0 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69     iRowidReg = i
2a900 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
2a910 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2a920 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
2a930 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2a940 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
2a950 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52  iIdxCur, iRowidR
2a960 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
2a970 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
2a980 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
2a990 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
2a9a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a9b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65  AddOp2(v, OP_See
2a9c0 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  k, iCur, iRowidR
2a9d0 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65  eg);  /* Deferre
2a9e0 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a  d seek */.    }.
2a9f0 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  .    /* Record t
2aa00 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
2aa10 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
2aa20 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62   the loop. Disab
2aa30 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45  le .    ** WHERE
2aa40 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
2aa50 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20  de redundant by 
2aa60 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20  the index range 
2aa70 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  scan..    */.   
2aa80 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
2aa90 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2aaa0 45 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20  E_UNIQUE ){.    
2aab0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
2aac0 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
2aad0 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
2aae0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
2aaf0 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65   OP_Prev;.    }e
2ab00 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
2ab10 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b  l->op = OP_Next;
2ab20 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
2ab30 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
2ab40 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2ab50 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2ab60 57 48 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e  WHERE_COVER_SCAN
2ab70 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
2ab80 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
2ab90 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
2aba0 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73  N_STEP;.    }els
2abb0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
2abc0 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
2abd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2abe0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2abf0 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
2ac00 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 65 76 65  TION.  if( pLeve
2ac10 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2ac20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
2ac30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
2ac40 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20  4:  Two or more 
2ac50 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78  separately index
2ac60 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
2ac70 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a  ed by OR.    **.
2ac80 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
2ac90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2aca0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2acb0 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a  a,b,c,d);.    **
2acc0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
2acd0 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20  i1 ON t1(a);.   
2ace0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
2acf0 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i2 ON t1(b);.
2ad00 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
2ad10 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63  INDEX i3 ON t1(c
2ad20 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
2ad30 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2ad40 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52   t1 WHERE a=5 OR
2ad50 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e   b=7 OR (c=11 AN
2ad60 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20  D d=13).    **. 
2ad70 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61     ** In the exa
2ad80 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20  mple, there are 
2ad90 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65  three indexed te
2ada0 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
2adb0 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20   OR..    ** The 
2adc0 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
2add0 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
2ade0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2adf0 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
2ae00 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
2ae10 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
2ae20 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
2ae30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2ae40 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  n, for each inde
2ae50 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f  xed term, the fo
2ae60 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67  llowing. The arg
2ae70 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a  uments to.    **
2ae80 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20   RowSetTest are 
2ae90 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f  such that the ro
2aea0 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  wid of the curre
2aeb0 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74  nt row is insert
2aec0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  ed.    ** into t
2aed0 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74  he RowSet. If it
2aee0 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
2aef0 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69  ent, control ski
2af00 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f  ps the.    ** Go
2af10 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a  sub opcode and j
2af20 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f  umps straight to
2af30 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
2af40 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28  ted by WhereEnd(
2af50 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2af60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2af70 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e  hereBegin(<term>
2af80 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ).    **        
2af90 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20    RowSetTest    
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
2afb0 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74  Insert rowid int
2afc0 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20  o rowset.    ** 
2afd0 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20           Gosub  
2afe0 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20      2 A.    **  
2aff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2b000 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20  reEnd().    **. 
2b010 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20     ** Following 
2b020 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20  the above, code 
2b030 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
2b040 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20   loop. Label A, 
2b050 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a  the target.    *
2b060 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61  * of the Gosub a
2b070 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74  bove, jumps to t
2b080 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72  he instruction r
2b090 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47  ight after the G
2b0a0 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oto..    **.    
2b0b0 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
2b0c0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
2b0d0 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
2b0e0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
2b0f0 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   1.    **       
2b100 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20     Goto       B 
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
2b120 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e   The loop is fin
2b130 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  ished..    **.  
2b140 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c    **       A: <l
2b150 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20  oop body>       
2b160 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75            # Retu
2b170 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65  rn data, whateve
2b180 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
2b190 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
2b1a0 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
2b1b0 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63        # Jump bac
2b1c0 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20  k to the Gosub. 
2b1d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
2b1e0 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65     B: <after the
2b1f0 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20   loop>.    **.  
2b200 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c    */.    WhereCl
2b210 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
2b220 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65  /* The OR-clause
2b230 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
2b240 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20   subterms */.   
2b250 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62   SrcList *pOrTab
2b260 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74  ;       /* Short
2b270 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20  ened table list 
2b280 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e  or OR-clause gen
2b290 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49  eration */.    I
2b2a0 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20  ndex *pCov = 0; 
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b2c0 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e  otential coverin
2b2d0 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c  g index (or NULL
2b2e0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  ) */.    int iCo
2b2f0 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  vCur = pParse->n
2b300 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f  Tab++;  /* Curso
2b310 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78  r used for index
2b320 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29 20   scans (if any) 
2b330 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52  */..    int regR
2b340 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
2b350 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
2b360 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73    /* Register us
2b370 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62  ed with OP_Gosub
2b380 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
2b390 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  owset = 0;      
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3b0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
2b3c0 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  r RowSet object 
2b3d0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
2b3e0 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b400 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2b410 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20  ding rowid */.  
2b420 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20    int iLoopBody 
2b430 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2b440 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53  eLabel(v);  /* S
2b450 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64  tart of loop bod
2b460 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65  y */.    int iRe
2b470 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
2b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b490 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2b4a0 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20   regReturn init 
2b4b0 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73  */.    int untes
2b4c0 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20  tedTerms = 0;   
2b4d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d            /* Som
2b4e0 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70  e terms not comp
2b4f0 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f  letely tested */
2b500 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b520 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2b530 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45  counter */.    E
2b540 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20  xpr *pAndExpr = 
2b550 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2b560 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20    /* An ".. AND 
2b570 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
2b580 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 54 65  n */.   .    pTe
2b590 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  rm = pLevel->pla
2b5a0 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20 20 61  n.u.pTerm;.    a
2b5b0 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
2b5c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2b5d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2b5e0 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61  & WO_OR );.    a
2b5f0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
2b600 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
2b610 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20  INFO)!=0 );.    
2b620 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWc = &pTerm->
2b630 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
2b640 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
2b650 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  OP_Return;.    p
2b660 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52  Level->p1 = regR
2b670 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53  eturn;..    /* S
2b680 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c  et up a new SrcL
2b690 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f  ist in pOrTab co
2b6a0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
2b6b0 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  le being scanned
2b6c0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
2b6d0 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d  loop in the a[0]
2b6e0 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f   slot and all no
2b6f0 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e  tReady tables in
2b700 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20   a[1..] slots.. 
2b710 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d     ** This becom
2b720 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  es the SrcList i
2b730 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
2b740 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
2b750 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20  hereBegin()..   
2b760 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e   */.    if( pWIn
2b770 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a  fo->nLevel>1 ){.
2b780 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65        int nNotRe
2b790 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
2b7a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
2b7b0 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74  er of notReady t
2b7c0 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73  ables */.      s
2b7d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2b7e0 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20  em *origSrc;    
2b7f0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73   /* Original lis
2b800 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
2b810 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d       nNotReady =
2b820 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
2b830 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20  - iLevel - 1;.  
2b840 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c      pOrTab = sql
2b850 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
2b860 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  w(pParse->db,.  
2b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b880 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
2b890 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
2b8a0 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
2b8b0 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
2b8c0 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
2b8d0 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
2b8e0 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
2b8f0 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36 29 28  >nAlloc = (i16)(
2b900 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a  nNotReady + 1);.
2b910 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53        pOrTab->nS
2b920 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c  rc = pOrTab->nAl
2b930 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  loc;.      memcp
2b940 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61  y(pOrTab->a, pTa
2b950 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70  bItem, sizeof(*p
2b960 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20  TabItem));.     
2b970 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66   origSrc = pWInf
2b980 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
2b990 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
2b9a0 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b  <=nNotReady; k++
2b9b0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
2b9c0 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c  y(&pOrTab->a[k],
2b9d0 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c   &origSrc[pLevel
2b9e0 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65  [k].iFrom], size
2b9f0 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29  of(pOrTab->a[k])
2ba00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ba10 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54  else{.      pOrT
2ba20 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ab = pWInfo->pTa
2ba30 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  bList;.    }..  
2ba40 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2ba50 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73  the rowset regis
2ba60 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e  ter to contain N
2ba70 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c  ULL. An SQL NULL
2ba80 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69   is .    ** equi
2ba90 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70  valent to an emp
2baa0 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a  ty rowset..    *
2bab0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e  *.    ** Also in
2bac0 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75  itialize regRetu
2bad0 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  rn to contain th
2bae0 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
2baf0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20   instruction .  
2bb00 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
2bb10 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f   following the O
2bb20 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20  P_Return at the 
2bb30 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
2bb40 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  op. This.    ** 
2bb50 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61  is required in a
2bb60 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46   few obscure LEF
2bb70 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65  T JOIN cases whe
2bb80 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  re control jumps
2bb90 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65  .    ** over the
2bba0 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
2bbb0 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
2bbc0 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61  f it. In this ca
2bbd0 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  se the .    ** c
2bbe0 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20  orrect response 
2bbf0 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c  for the end-of-l
2bc00 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50  oop code (the OP
2bc10 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a  _Return) is to .
2bc20 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f      ** fall thro
2bc30 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2bc40 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73  instruction, jus
2bc50 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20  t as an OP_Next 
2bc60 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63  does if.    ** c
2bc70 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  alled on an unin
2bc80 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72  itialized cursor
2bc90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2bca0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2bcb0 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
2bcc0 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
2bcd0 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
2bce0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2bcf0 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
2bd00 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2bd10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2bd20 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
2bd30 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
2bd40 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
2bd50 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
2bd60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2bd70 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
2bd80 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  rn);..    /* If 
2bd90 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  the original WHE
2bda0 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f  RE clause is z o
2bdb0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31  f the form:  (x1
2bdc0 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41   OR x2 OR ...) A
2bdd0 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e  ND y.    ** Then
2bde0 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
2bdf0 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20  xN, evaluate as 
2be00 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
2be10 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20  n: xN AND z.    
2be20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72  ** That way, ter
2be30 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65  ms in y that are
2be40 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74   factored into t
2be50 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77  he disjunction w
2be60 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69  ill.    ** be pi
2be70 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72  cked up by the r
2be80 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
2be90 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
2bea0 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20  gin() below..   
2beb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61   **.    ** Actua
2bec0 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70  lly, each subexp
2bed0 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65  ression is conve
2bee0 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20  rted to "xN AND 
2bef0 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20  w" where w is.  
2bf00 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65    ** the "intere
2bf10 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20  sting" terms of 
2bf20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64  z - terms that d
2bf30 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
2bf40 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   in the.    ** O
2bf50 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2bf60 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
2bf70 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74  , and terms that
2bf80 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a   are usable as .
2bf90 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a      ** indices..
2bfa0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2bfb0 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20  WC->nTerm>1 ){. 
2bfc0 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a       int iTerm;.
2bfd0 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d        for(iTerm=
2bfe0 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54  0; iTerm<pWC->nT
2bff0 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20  erm; iTerm++){. 
2c000 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
2c010 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72  pr = pWC->a[iTer
2c020 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m].pExpr;.      
2c030 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2c040 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2c050 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74  FromJoin) ) cont
2c060 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
2c070 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
2c080 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
2c090 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 4f 52 49  VIRTUAL|TERM_ORI
2c0a0 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NFO) ) continue;
2c0b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
2c0c0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65  C->a[iTerm].eOpe
2c0d0 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d  rator & WO_ALL)=
2c0e0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2c0f0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
2c100 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
2c110 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
2c120 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e   0);.        pAn
2c130 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  dExpr = sqlite3E
2c140 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
2c150 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78  b, pAndExpr, pEx
2c160 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
2c170 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
2c180 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  ){.        pAndE
2c190 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
2c1a0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e  pr(pParse, TK_AN
2c1b0 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20  D, 0, pAndExpr, 
2c1c0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2c1d0 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  }..    for(ii=0;
2c1e0 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   ii<pOrWc->nTerm
2c1f0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57  ; ii++){.      W
2c200 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
2c210 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69  m = &pOrWc->a[ii
2c220 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ];.      if( pOr
2c230 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
2c240 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65  ==iCur || (pOrTe
2c250 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2c260 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
2c270 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20        WhereInfo 
2c280 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20  *pSubWInfo;     
2c290 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72       /* Info for
2c2a0 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20   single OR-term 
2c2b0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  scan */.        
2c2c0 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20  Expr *pOrExpr = 
2c2d0 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  pOrTerm->pExpr;.
2c2e0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64          if( pAnd
2c2f0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2c300 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
2c310 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20  t = pOrExpr;.   
2c320 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d         pOrExpr =
2c330 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20   pAndExpr;.     
2c340 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
2c350 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  Loop through tab
2c360 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
2c370 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
2c380 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rm. */.        p
2c390 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
2c3a0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2c3b0 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72  rse, pOrTab, pOr
2c3c0 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Expr, 0, 0,.    
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3e0 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f      WHERE_OMIT_O
2c3f0 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52  PEN_CLOSE | WHER
2c400 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20  E_AND_ONLY |.   
2c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c420 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45       WHERE_FORCE
2c430 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f  _TABLE | WHERE_O
2c440 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43  NETABLE_ONLY, iC
2c450 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  ovCur);.        
2c460 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
2c470 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  o || pParse->nEr
2c480 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
2c490 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
2c4a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
2c4b0 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  bWInfo ){.      
2c4c0 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
2c4d0 70 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pLvl;.          
2c4e0 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
2c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
2c500 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70  arse, pOrTab, &p
2c510 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  SubWInfo->a[0], 
2c520 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e  iLevel, pLevel->
2c530 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20  iFrom, 0.       
2c540 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
2c550 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
2c560 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
2c570 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
2c580 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65           int iSe
2c590 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d  t = ((ii==pOrWc-
2c5a0 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29  >nTerm-1)?-1:ii)
2c5b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
2c5c0 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t r;.           
2c5d0 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   r = sqlite3Expr
2c5e0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
2c5f0 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
2c600 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20  pTab, -1, iCur, 
2c610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c630 20 20 20 20 20 20 20 20 20 20 72 65 67 52 6f 77            regRow
2c640 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  id, 0);.        
2c650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c660 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52  ddOp4Int(v, OP_R
2c670 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f  owSetTest, regRo
2c680 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  wset,.          
2c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c6b0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2c6c0 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20  +2, r, iSet);.  
2c6d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c6e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c6f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2c700 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c  b, regReturn, iL
2c710 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20  oopBody);..     
2c720 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62       /* The pSub
2c730 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
2c740 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20  erms flag means 
2c750 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72  that this OR ter
2c760 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  m.          ** c
2c770 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20  ontained one or 
2c780 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72  more AND term fr
2c790 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61  om a notReady ta
2c7a0 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  ble.  The.      
2c7b0 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f      ** terms fro
2c7c0 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74  m the notReady t
2c7d0 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  able could not b
2c7e0 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c  e tested and wil
2c7f0 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  l.          ** n
2c800 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64  eed to be tested
2c810 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20   later..        
2c820 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
2c830 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  f( pSubWInfo->un
2c840 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e  testedTerms ) un
2c850 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b  testedTerms = 1;
2c860 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
2c870 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d  f all of the OR-
2c880 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
2c890 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73  are optimized us
2c8a0 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20  ing the same.   
2c8b0 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c         ** index,
2c8c0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
2c8d0 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  s opened using t
2c8e0 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e  he same cursor n
2c8f0 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20  umber.          
2c900 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20  ** by each call 
2c910 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
2c920 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74  egin() made by t
2c930 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79  his loop, it may
2c940 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
2c950 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
2c960 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61   that index as a
2c970 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
2c980 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
2c990 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
2c9a0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
2c9b0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62  3WhereBegin() ab
2c9c0 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ove resulted in 
2c9d0 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20  a scan that.    
2c9e0 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e        ** uses an
2c9f0 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73   index, and this
2ca00 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66   is either the f
2ca10 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  irst OR-connecte
2ca20 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  d term.         
2ca30 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72   ** processed or
2ca40 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68   the index is th
2ca50 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75  e same as that u
2ca60 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69  sed by all previ
2ca70 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
2ca80 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76   terms, set pCov
2ca90 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74   to the candidat
2caa0 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
2cab0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
2cac0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
2cad0 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69  Cov to NULL to i
2cae0 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20  ndicate that no 
2caf0 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
2cb00 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20  ng index will . 
2cb10 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61           ** be a
2cb20 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20  vailable..      
2cb30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2cb40 20 70 4c 76 6c 20 3d 20 26 70 53 75 62 57 49 6e   pLvl = &pSubWIn
2cb50 66 6f 2d 3e 61 5b 30 5d 3b 0a 20 20 20 20 20 20  fo->a[0];.      
2cb60 20 20 20 20 69 66 28 20 28 70 4c 76 6c 2d 3e 70      if( (pLvl->p
2cb70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2cb80 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
2cb90 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
2cba0 4c 76 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  Lvl->plan.wsFlag
2cbb0 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
2cbc0 4e 44 45 58 29 3d 3d 30 0a 20 20 20 20 20 20 20  NDEX)==0.       
2cbd0 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c      && (ii==0 ||
2cbe0 20 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49   pLvl->plan.u.pI
2cbf0 64 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20  dx==pCov).      
2cc00 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2cc10 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d     assert( pLvl-
2cc20 3e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75  >iIdxCur==iCovCu
2cc30 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
2cc40 20 70 43 6f 76 20 3d 20 70 4c 76 6c 2d 3e 70 6c   pCov = pLvl->pl
2cc50 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20  an.u.pIdx;.     
2cc60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2cc70 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30          pCov = 0
2cc80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
2cc90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
2cca0 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f  sh the loop thro
2ccb0 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
2ccc0 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
2ccd0 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
2cce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2ccf0 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66  hereEnd(pSubWInf
2cd00 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  o);.        }.  
2cd10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2cd20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
2cd30 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66  x = pCov;.    if
2cd40 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d  ( pCov ) pLevel-
2cd50 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43  >iIdxCur = iCovC
2cd60 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64  ur;.    if( pAnd
2cd70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41  Expr ){.      pA
2cd80 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
2cd90 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
2cda0 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
2cdb0 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72 29  e->db, pAndExpr)
2cdc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2cdd0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
2cde0 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c  v, iRetInit, sql
2cdf0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2ce00 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c  ddr(v));.    sql
2ce10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2ce20 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
2ce30 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
2ce40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2ce50 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
2ce60 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
2ce70 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
2ce80 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  el>1 ) sqlite3St
2ce90 61 63 6b 46 72 65 65 28 70 50 61 72 73 65 2d 3e  ackFree(pParse->
2cea0 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20  db, pOrTab);.   
2ceb0 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65   if( !untestedTe
2cec0 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72  rms ) disableTer
2ced0 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
2cee0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
2cef0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2cf00 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
2cf10 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43  */..  {.    /* C
2cf20 61 73 65 20 35 3a 20 20 54 68 65 72 65 20 69 73  ase 5:  There is
2cf30 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78   no usable index
2cf40 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20  .  We must do a 
2cf50 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20  complete.    ** 
2cf60 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
2cf70 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
2cf80 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
2cf90 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
2cfa0 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78  tep[] = { OP_Nex
2cfb0 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20  t, OP_Prev };.  
2cfc0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
2cfd0 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f  8 aStart[] = { O
2cfe0 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73  P_Rewind, OP_Las
2cff0 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t };.    assert(
2d000 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76   bRev==0 || bRev
2d010 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
2d020 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
2d030 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
2d040 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b  p = aStep[bRev];
2d050 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
2d060 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
2d070 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c  el->p2 = 1 + sql
2d080 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d090 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20  , aStart[bRev], 
2d0a0 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a  iCur, addrBrk);.
2d0b0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
2d0c0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
2d0d0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
2d0e0 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79  ;.  }.  notReady
2d0f0 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43   &= ~getMask(pWC
2d100 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->pMaskSet, iCur
2d110 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20  );..  /* Insert 
2d120 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65  code to test eve
2d130 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ry subexpression
2d140 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d   that can be com
2d150 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d  pletely.  ** com
2d160 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  puted using the 
2d170 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74  current set of t
2d180 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
2d190 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
2d1a0 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35 30 39 33  OF: R-49525-5093
2d1b0 35 20 54 65 72 6d 73 20 74 68 61 74 20 63 61 6e  5 Terms that can
2d1c0 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69 65 64  not be satisfied
2d1d0 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68   through.  ** th
2d1e0 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  e use of indices
2d1f0 20 62 65 63 6f 6d 65 20 74 65 73 74 73 20 74 68   become tests th
2d200 61 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  at are evaluated
2d210 20 61 67 61 69 6e 73 74 20 65 61 63 68 20 72 6f   against each ro
2d220 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  w of.  ** the re
2d230 6c 65 76 61 6e 74 20 69 6e 70 75 74 20 74 61 62  levant input tab
2d240 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
2d250 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
2d260 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
2d270 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
2d280 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
2d290 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
2d2a0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
2d2b0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
2d2c0 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36  IMP: R-30575-116
2d2d0 36 32 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  62 */.    testca
2d2e0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
2d2f0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
2d300 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
2d310 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
2d320 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
2d330 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
2d340 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
2d350 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
2d360 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
2d370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
2d380 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
2d390 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  rms==0.         
2d3a0 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
2d3b0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2d3c0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
2d3d0 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  LY)!=0 );.      
2d3e0 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
2d3f0 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20  Terms = 1;.     
2d400 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2d410 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
2d420 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
2d430 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20  rt( pE!=0 );.   
2d440 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
2d450 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48  ftJoin && !ExprH
2d460 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
2d470 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
2d480 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2d490 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2d4a0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2d4b0 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74  se, pE, addrCont
2d4c0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2d4d0 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d  ULL);.    pTerm-
2d4e0 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
2d4f0 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f  _CODED;.  }..  /
2d500 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54  * For a LEFT OUT
2d510 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74  ER JOIN, generat
2d520 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
2d530 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
2d540 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65   that.  ** at le
2d550 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
2d560 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
2d570 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
2d580 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a  eft table.  .  *
2d590 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
2d5a0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
2d5b0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
2d5c0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
2d5d0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2d5e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d5f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2d600 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 1, pLevel->
2d610 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
2d620 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2d630 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49  "record LEFT JOI
2d640 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71  N hit"));.    sq
2d650 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2d660 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2d670 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
2d680 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e  a, j=0; j<pWC->n
2d690 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
2d6a0 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ++){.      testc
2d6b0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
2d6c0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
2d6d0 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  AL );  /* IMP: R
2d6e0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
2d6f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d700 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
2d710 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
2d720 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
2d730 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
2d740 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
2d750 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
2d760 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
2d770 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
2d780 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
2d790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
2d7a0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
2d7b0 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63  rms );.        c
2d7c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2d7d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d7e0 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
2d7f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2d800 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
2d810 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64  pTerm->pExpr, ad
2d820 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
2d830 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2d840 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
2d850 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
2d860 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2d870 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2d880 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61  g(pParse, iRelea
2d890 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72  seReg);..  retur
2d8a0 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23  n notReady;.}..#
2d8b0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2d8c0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68  E_TEST)./*.** Th
2d8d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
2d8e0 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78  able holds a tex
2d8f0 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  t description of
2d900 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65   query plan gene
2d910 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  rated.** by the 
2d920 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
2d930 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
2d940 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63  Begin().  Each c
2d950 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69  all to WhereBegi
2d960 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  n.** overwrites 
2d970 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54  the previous.  T
2d980 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
2d990 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
2d9a0 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
2d9b0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61  sis only..*/.cha
2d9c0 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  r sqlite3_query_
2d9d0 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20  plan[BMS*2*40]; 
2d9e0 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
2d9f0 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  join */.static i
2da00 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20  nt nQPlan = 0;  
2da10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2da20 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e  ext free slow in
2da30 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a   _query_plan[] *
2da40 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
2da50 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a  ITE_TEST */.../*
2da60 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
2da70 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
2da80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
2da90 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
2daa0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
2dab0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
2dac0 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f  f( ALWAYS(pWInfo
2dad0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
2dae0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2daf0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
2db00 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
2db10 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
2db20 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  Info = pWInfo->a
2db30 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20  [i].pIdxInfo;.  
2db40 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b      if( pInfo ){
2db50 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65  .        /* asse
2db60 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54  rt( pInfo->needT
2db70 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20 7c  oFreeIdxStr==0 |
2db80 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2db90 65 64 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  ed ); */.       
2dba0 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64   if( pInfo->need
2dbb0 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a  ToFreeIdxStr ){.
2dbc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2dbd0 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64  3_free(pInfo->id
2dbe0 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  xStr);.        }
2dbf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2dc00 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 66 6f  DbFree(db, pInfo
2dc10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2dc20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 61 5b 69   if( pWInfo->a[i
2dc30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ].plan.wsFlags &
2dc40 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
2dc50 58 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64  X ){.        Ind
2dc60 65 78 20 2a 70 49 64 78 20 3d 20 70 57 49 6e 66  ex *pIdx = pWInf
2dc70 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70  o->a[i].plan.u.p
2dc80 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Idx;.        if(
2dc90 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20   pIdx ){.       
2dca0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2dcb0 28 64 62 2c 20 70 49 64 78 2d 3e 7a 43 6f 6c 41  (db, pIdx->zColA
2dcc0 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ff);.          s
2dcd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2dce0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
2dcf0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2dd00 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43      whereClauseC
2dd10 6c 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43  lear(pWInfo->pWC
2dd20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
2dd30 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2dd40 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
2dd50 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67  Generate the beg
2dd60 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
2dd70 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52  op used for WHER
2dd80 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2dd90 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ing..** The retu
2dda0 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f  rn value is a po
2ddb0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71  inter to an opaq
2ddc0 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ue structure tha
2ddd0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e  t contains.** in
2dde0 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64  formation needed
2ddf0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
2de00 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20  e loop.  Later, 
2de10 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
2de20 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e  ine.** should in
2de30 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72  voke sqlite3Wher
2de40 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20  eEnd() with the 
2de50 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
2de60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
2de70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
2de80 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20  plete the WHERE 
2de90 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
2dea0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
2deb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
2dec0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2ded0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
2dee0 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20  e basic idea is 
2def0 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c  to do a nested l
2df00 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f  oop, one loop fo
2df10 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a  r each table in.
2df20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
2df30 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  se of a select. 
2df40 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44   (INSERT and UPD
2df50 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ATE statements a
2df60 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  re the.** same a
2df70 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20  s a SELECT with 
2df80 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
2df90 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
2dfa0 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a  clause.)  For.**
2dfb0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
2dfc0 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a   SQL is this:.**
2dfd0 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54  .**       SELECT
2dfe0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
2dff0 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a  t3 WHERE ...;.**
2e000 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64  .** Then the cod
2e010 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63  e generated is c
2e020 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65  onceptually like
2e030 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
2e040 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61  **.**      forea
2e050 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
2e060 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
2e070 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
2e080 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
2e090 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20  2 in t2 do      
2e0a0 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
2e0b0 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20  ereBegin().**   
2e0c0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
2e0d0 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f  ow3 in t3 do   /
2e0e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e  .**            .
2e0f0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65  ...**          e
2e100 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
2e110 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
2e120 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
2e130 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
2e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e150 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
2e160 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
2e170 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
2e180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
2e190 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2e1a0 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e  he loops might n
2e1b0 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20  ot be nested in 
2e1c0 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
2e1d0 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61  ch they.** appea
2e1e0 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
2e1f0 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72  ause if a differ
2e200 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74  ent order is bet
2e210 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ter able to make
2e220 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63  .** use of indic
2e230 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  es.  Note also t
2e240 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20  hat when the IN 
2e250 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73  operator appears
2e260 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
2e270 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68   clause, it migh
2e280 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69  t result in addi
2e290 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f  tional nested lo
2e2a0 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e  ops for.** scann
2e2b0 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
2e2c0 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69  values on the ri
2e2d0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
2e2e0 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54   the IN..**.** T
2e2f0 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63  here are Btree c
2e300 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
2e310 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c  d with each tabl
2e320 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73  e.  t1 uses curs
2e330 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61  or.** number pTa
2e340 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
2e350 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68  sor.  t2 uses th
2e360 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73  e cursor pTabLis
2e370 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e  t->a[1].iCursor.
2e380 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  .** And so forth
2e390 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2e3a0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
2e3b0 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42  o open those VDB
2e3c0 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64  E cursors.** and
2e3d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2e3e0 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  () generates the
2e3f0 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74   code to close t
2e400 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  hem..**.** The c
2e410 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
2e420 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e  WhereBegin() gen
2e430 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68  erates leaves th
2e440 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a  e cursors named.
2e450 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70  ** in pTabList p
2e460 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72  ointing at their
2e470 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
2e480 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d  ries.  The [...]
2e490 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65   code.** can use
2e4a0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f   OP_Column and O
2e4b0 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20  P_Rowid opcodes 
2e4c0 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73  on these cursors
2e4d0 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64   to extract.** d
2e4e0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72  ata from the var
2e4f0 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74  ious tables of t
2e500 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  he loop..**.** I
2e510 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2e520 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  se is empty, the
2e530 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d   foreach loops m
2e540 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68  ust each scan th
2e550 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61  eir.** entire ta
2e560 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68  bles.  Thus a th
2e570 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20  ree-way join is 
2e580 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74  an O(N^3) operat
2e590 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ion.  But if.** 
2e5a0 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  the tables have 
2e5b0 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
2e5c0 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74  e are terms in t
2e5d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2e5e0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f  that.** refer to
2e5f0 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20   those indices, 
2e600 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65  a complete table
2e610 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f   scan can be avo
2e620 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ided and the.** 
2e630 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75  code will run mu
2e640 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74  ch faster.  Most
2e650 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   of the work of 
2e660 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2e670 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73  checking.** to s
2e680 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
2e690 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e  indices that can
2e6a0 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65   be used to spee
2e6b0 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  d up the loop..*
2e6c0 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68  *.** Terms of th
2e6d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
2e6e0 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  re also used to 
2e6f0 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73  limit which rows
2e700 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b   actually.** mak
2e710 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e  e it to the "...
2e720 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  " in the middle 
2e730 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66  of the loop.  Af
2e740 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63  ter each "foreac
2e750 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20  h",.** terms of 
2e760 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2e770 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74   that use only t
2e780 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f  erms in that loo
2e790 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c  p and outer.** l
2e7a0 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74  oops are evaluat
2e7b0 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20  ed and if false 
2e7c0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61  a jump is made a
2e7d0 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  round all subseq
2e7e0 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f  uent.** inner lo
2e7f0 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74  ops (or around t
2e800 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20  he "..." if the 
2e810 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68  test occurs with
2e820 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a  in the inner-.**
2e830 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a   most loop).**.*
2e840 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a  * OUTER JOINS.**
2e850 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69  .** An outer joi
2e860 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61  n of tables t1 a
2e870 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74  nd t2 is concept
2e880 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f  ally coded as fo
2e890 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
2e8a0 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
2e8b0 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c  t1 do.**      fl
2e8c0 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66  ag = 0.**      f
2e8d0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
2e8e0 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  2 do.**        s
2e8f0 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20  tart:.**        
2e900 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
2e910 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20    flag = 1.**   
2e920 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69     end.**      i
2e930 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a  f flag==0 then.*
2e940 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68  *        move th
2e950 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f  e row2 cursor to
2e960 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20   a null row.**  
2e970 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74        goto start
2e980 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20  .**      fi.**  
2e990 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45    end.**.** ORDE
2e9a0 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43  R BY CLAUSE PROC
2e9b0 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72  ESSING.**.** pOr
2e9c0 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
2e9d0 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
2e9e0 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  BY clause of a S
2e9f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
2ea00 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
2ea10 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
2ea20 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
2ea30 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
2ea40 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
2ea50 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
2ea60 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
2ea70 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f  atement, then pO
2ea80 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
2ea90 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65  **.** If an inde
2eaa0 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f  x can be used so
2eab0 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61   that the natura
2eac0 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f  l output order o
2ead0 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73  f the table.** s
2eae0 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66  can is correct f
2eaf0 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
2eb00 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61  clause, then tha
2eb10 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20  t index is used 
2eb20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 65 74 75 72  and.** the retur
2eb30 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 2e 6e 4f  ned WhereInfo.nO
2eb40 42 53 61 74 20 66 69 65 6c 64 20 69 73 20 73 65  BSat field is se
2eb50 74 20 74 6f 20 70 4f 72 64 65 72 42 79 2d 3e 6e  t to pOrderBy->n
2eb60 45 78 70 72 2e 20 20 54 68 69 73 0a 2a 2a 20 69  Expr.  This.** i
2eb70 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2eb80 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20  n that prevents 
2eb90 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  an unnecessary s
2eba0 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ort of the resul
2ebb0 74 20 73 65 74 0a 2a 2a 20 69 66 20 61 6e 20 69  t set.** if an i
2ebc0 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65  ndex appropriate
2ebd0 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42   for the ORDER B
2ebe0 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79  Y clause already
2ebf0 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49   exists..**.** I
2ec00 66 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75  f the where clau
2ec10 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20  se loops cannot 
2ec20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70  be arranged to p
2ec30 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72 65  rovide the corre
2ec40 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64  ct.** output ord
2ec50 65 72 2c 20 74 68 65 6e 20 57 68 65 72 65 49 6e  er, then WhereIn
2ec60 66 6f 2e 6e 4f 42 53 61 74 20 69 73 20 30 2e 0a  fo.nOBSat is 0..
2ec70 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
2ec80 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2ec90 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2eca0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2ecb0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2ecc0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
2ecd0 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c  bList,    /* A l
2ece0 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
2ecf0 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
2ed00 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
2ed10 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2ed20 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2ed30 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
2ed40 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
2ed50 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
2ed60 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
2ed70 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
2ed80 74 2c 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63  t,  /* The selec
2ed90 74 2d 6c 69 73 74 20 66 6f 72 20 44 49 53 54 49  t-list for DISTI
2eda0 4e 43 54 20 71 75 65 72 69 65 73 20 2d 20 6f 72  NCT queries - or
2edb0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77   NULL */.  u16 w
2edc0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
2edd0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
2ede0 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
2edf0 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
2ee00 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  t.h */.  int iId
2ee10 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f  xCur           /
2ee20 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41  * If WHERE_ONETA
2ee30 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
2ee40 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75   index cursor nu
2ee50 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mber */.){.  int
2ee60 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
2ee70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
2ee80 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
2ee90 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
2eea0 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ruct */.  int nT
2eeb0 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
2eec0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2eed0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54  f elements in pT
2eee0 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
2eef0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2ef00 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
2ef10 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
2ef20 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
2ef30 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
2ef40 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2ef50 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
2ef60 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
2ef70 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  engine */.  Bitm
2ef80 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
2ef90 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
2efa0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
2efb0 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
2efc0 0a 20 20 57 68 65 72 65 42 65 73 74 49 64 78 20  .  WhereBestIdx 
2efd0 73 57 42 49 3b 20 20 20 20 20 20 20 20 20 2f 2a  sWBI;         /*
2efe0 20 42 65 73 74 20 69 6e 64 65 78 20 73 65 61 72   Best index sear
2eff0 63 68 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ch context */.  
2f000 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
2f010 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
2f020 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
2f030 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
2f040 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
2f050 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
2f060 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66  e level in pWInf
2f070 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  o->a[] */.  int 
2f080 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  iFrom;          
2f090 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2f0a0 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75  unused FROM clau
2f0b0 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  se element */.  
2f0c0 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20  int andFlags;   
2f0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e             /* AN
2f0e0 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  D-ed combination
2f0f0 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d   of all pWC->a[]
2f100 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  .wtFlags */.  in
2f110 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
2f120 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2f130 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71   counter */.  sq
2f140 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
2f150 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2f160 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2f170 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  */...  /* Variab
2f180 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  le initializatio
2f190 6e 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73  n */.  memset(&s
2f1a0 57 42 49 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  WBI, 0, sizeof(s
2f1b0 57 42 49 29 29 3b 0a 20 20 73 57 42 49 2e 70 50  WBI));.  sWBI.pP
2f1c0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 0a  arse = pParse;..
2f1d0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
2f1e0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
2f1f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2f200 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
2f210 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
2f220 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
2f230 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
2f240 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
2f250 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70  ==BMS );.  if( p
2f260 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
2f270 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
2f280 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2f290 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
2f2a0 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
2f2b0 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
2f2c0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
2f2d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d  is function norm
2f2e0 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61  ally generates a
2f2f0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72   nested loop for
2f300 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a   all tables in .
2f310 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20    ** pTabList.  
2f320 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45  But if the WHERE
2f330 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
2f340 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
2f350 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
2f360 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
2f370 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
2f380 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
2f390 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
2f3a0 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
2f3b0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
2f3c0 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
2f3d0 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
2f3e0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
2f3f0 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
2f400 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2f410 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20  NETABLE_ONLY) ? 
2f420 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  1 : pTabList->nS
2f430 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  rc;..  /* Alloca
2f440 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
2f450 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
2f460 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
2f470 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
2f480 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
2f490 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  . A single alloc
2f4a0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
2f4b0 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65   store the Where
2f4c0 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74  Info.  ** struct
2f4d0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
2f4e0 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c  f WhereInfo.a[],
2f4f0 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
2f500 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
2f510 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73  and the WhereMas
2f520 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20  kSet structure. 
2f530 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73  Since WhereClaus
2f540 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d  e contains an 8-
2f550 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  byte.  ** field 
2f560 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69  (type Bitmask) i
2f570 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65  t must be aligne
2f580 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62  d on an 8-byte b
2f590 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20  oundary on.  ** 
2f5a0 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72  some architectur
2f5b0 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f  es. Hence the RO
2f5c0 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20  UND8() below..  
2f5d0 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
2f5e0 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57 49 6e  ->db;.  nByteWIn
2f5f0 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
2f600 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
2f610 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
2f620 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
2f630 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2f640 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
2f650 62 2c 20 0a 20 20 20 20 20 20 6e 42 79 74 65 57  b, .      nByteW
2f660 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20 73 69  Info + .      si
2f670 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75 73 65  zeof(WhereClause
2f680 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  ) +.      sizeof
2f690 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29 0a 20  (WhereMaskSet). 
2f6a0 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
2f6b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2f6c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2f6d0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
2f6e0 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
2f6f0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2f700 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
2f710 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
2f720 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
2f730 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
2f740 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
2f750 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
2f760 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
2f770 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
2f780 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2f790 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 73 57  pWInfo->pWC = sW
2f7a0 42 49 2e 70 57 43 20 3d 20 28 57 68 65 72 65 43  BI.pWC = (WhereC
2f7b0 6c 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29  lause *)&((u8 *)
2f7c0 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e  pWInfo)[nByteWIn
2f7d0 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  fo];.  pWInfo->w
2f7e0 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
2f7f0 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f  lFlags;.  pWInfo
2f800 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2f810 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
2f820 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53  ryLoop;.  pMaskS
2f830 65 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53  et = (WhereMaskS
2f840 65 74 2a 29 26 73 57 42 49 2e 70 57 43 5b 31 5d  et*)&sWBI.pWC[1]
2f850 3b 0a 20 20 73 57 42 49 2e 61 4c 65 76 65 6c 20  ;.  sWBI.aLevel 
2f860 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 0a 20 20  = pWInfo->a;..  
2f870 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44  /* Disable the D
2f880 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61  ISTINCT optimiza
2f890 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44  tion if SQLITE_D
2f8a0 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65  istinctOpt is se
2f8b0 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74  t via.  ** sqlit
2f8c0 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c  e3_test_ctrl(SQL
2f8d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
2f8e0 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20  IMIZATIONS,...) 
2f8f0 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
2f900 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
2f910 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  , SQLITE_Distinc
2f920 74 4f 70 74 29 20 29 20 70 44 69 73 74 69 6e 63  tOpt) ) pDistinc
2f930 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 6c  t = 0;..  /* Spl
2f940 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
2f950 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
2f960 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
2f970 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
2f980 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
2f990 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
2f9a0 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
2f9b0 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
2f9c0 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20  et(pMaskSet);.  
2f9d0 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
2f9e0 73 57 42 49 2e 70 57 43 2c 20 70 50 61 72 73 65  sWBI.pWC, pParse
2f9f0 2c 20 70 4d 61 73 6b 53 65 74 2c 20 77 63 74 72  , pMaskSet, wctr
2fa00 6c 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  lFlags);.  sqlit
2fa10 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61  e3ExprCodeConsta
2fa20 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68 65  nts(pParse, pWhe
2fa30 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  re);.  whereSpli
2fa40 74 28 73 57 42 49 2e 70 57 43 2c 20 70 57 68 65  t(sWBI.pWC, pWhe
2fa50 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f  re, TK_AND);   /
2fa60 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35  * IMP: R-15842-5
2fa70 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f  3296 */.    .  /
2fa80 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
2fa90 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
2faa0 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
2fab0 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
2fac0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
2fad0 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
2fae0 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
2faf0 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
2fb00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
2fb10 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74  ere && (nTabList
2fb20 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
2fb30 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
2fb40 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a  oin(pWhere)) ){.
2fb50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2fb60 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2fb70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  Where, pWInfo->i
2fb80 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55  Break, SQLITE_JU
2fb90 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
2fba0 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Where = 0;.  }..
2fbb0 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69    /* Assign a bi
2fbc0 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61  t from the bitma
2fbd0 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  sk to every term
2fbe0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2fbf0 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  use..  **.  ** W
2fc00 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69  hen assigning bi
2fc10 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20  tmask values to 
2fc20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73  FROM clause curs
2fc30 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a  ors, it must be.
2fc40 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68    ** the case th
2fc50 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62  at if X is the b
2fc60 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e  itmask for the N
2fc70 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  -th FROM clause 
2fc80 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74  term then.  ** t
2fc90 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
2fca0 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ll FROM clause t
2fcb0 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74  erms to the left
2fcc0 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72   of the N-th ter
2fcd0 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e  m.  ** is (X-1).
2fce0 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e     An expression
2fcf0 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61   from the ON cla
2fd00 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
2fd10 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20  IN can use.  ** 
2fd20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a  its Expr.iRightJ
2fd30 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74  oinTable value t
2fd40 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61  o find the bitma
2fd50 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  sk of the right 
2fd60 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68  table.  ** of th
2fd70 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63  e join.  Subtrac
2fd80 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68  ting one from th
2fd90 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69  e right table bi
2fda0 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20  tmask gives a.  
2fdb0 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  ** bitmask for a
2fdc0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
2fdd0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
2fde0 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20  n.  Knowing the 
2fdf0 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72  bitmask.  ** for
2fe00 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
2fe10 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66  he left of a lef
2fe20 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74  t join is import
2fe30 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30  ant.  Ticket #30
2fe40 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  15..  **.  ** No
2fe50 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73  te that bitmasks
2fe60 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
2fe70 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e   all pTabList->n
2fe80 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20  Src tables in.  
2fe90 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
2fea0 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
2feb0 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
2fec0 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
2fed0 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61  rmally.  ** equa
2fee0 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e  l to pTabList->n
2fef0 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65  Src but might be
2ff00 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20   shortened to 1 
2ff10 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52  if the.  ** WHER
2ff20 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
2ff30 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a  flag is set..  *
2ff40 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
2ff50 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2ff60 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61   ii++){.    crea
2ff70 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  teMask(pMaskSet,
2ff80 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
2ff90 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  .iCursor);.  }.#
2ffa0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
2ffb0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f  {.    Bitmask to
2ffc0 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  TheLeft = 0;.   
2ffd0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
2ffe0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
2fff0 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  ++){.      Bitma
30000 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70  sk m = getMask(p
30010 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
30020 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
30030 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30040 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66   (m-1)==toTheLef
30050 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65  t );.      toThe
30060 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d  Left |= m;.    }
30070 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
30080 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
30090 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
300a0 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ons.  Note that 
300b0 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69  exprAnalyze() mi
300c0 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77  ght.  ** add new
300d0 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f   virtual terms o
300e0 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
300f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
30100 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a    We do not.  **
30110 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65   want to analyze
30120 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74   these virtual t
30130 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61  erms, so start a
30140 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20  nalyzing at the 
30150 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72  end.  ** and wor
30160 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61  k forward so tha
30170 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74  t the added virt
30180 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65  ual terms are ne
30190 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20  ver processed.. 
301a0 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a   */.  exprAnalyz
301b0 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 73  eAll(pTabList, s
301c0 57 42 49 2e 70 57 43 29 3b 0a 20 20 69 66 28 20  WBI.pWC);.  if( 
301d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
301e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
301f0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
30200 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
30210 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75   the DISTINCT qu
30220 61 6c 69 66 69 65 72 2c 20 69 66 20 74 68 65 72  alifier, if ther
30230 65 20 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64  e is one, is red
30240 75 6e 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66  undant. .  ** If
30250 20 69 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74   it is, then set
30260 20 70 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55   pDistinct to NU
30270 4c 4c 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f  LL and WhereInfo
30280 2e 65 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20  .eDistinct to.  
30290 2a 2a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  ** WHERE_DISTINC
302a0 54 5f 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c  T_UNIQUE to tell
302b0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69   the caller to i
302c0 67 6e 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e  gnore the DISTIN
302d0 43 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  CT..  */.  if( p
302e0 44 69 73 74 69 6e 63 74 20 26 26 20 69 73 44 69  Distinct && isDi
302f0 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
30300 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
30310 2c 20 73 57 42 49 2e 70 57 43 2c 20 70 44 69 73  , sWBI.pWC, pDis
30320 74 69 6e 63 74 29 20 29 7b 0a 20 20 20 20 70 44  tinct) ){.    pD
30330 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
30340 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
30350 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
30360 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a  NCT_UNIQUE;.  }.
30370 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20  .  /* Chose the 
30380 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73  best index to us
30390 65 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  e for each table
303a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
303b0 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  use..  **.  ** T
303c0 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69  his loop fills i
303d0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
303e0 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a  fields:.  **.  *
303f0 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
30400 70 49 64 78 20 20 20 20 20 20 54 68 65 20 69 6e  pIdx      The in
30410 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
30420 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  his level of the
30430 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57   loop..  **   pW
30440 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67  Info->a[].wsFlag
30450 73 20 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c  s   WHERE_xxx fl
30460 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
30470 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20  ith pIdx.  **   
30480 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20  pWInfo->a[].nEq 
30490 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72        The number
304a0 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f   of == and IN co
304b0 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20  nstraints.  **  
304c0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72   pWInfo->a[].iFr
304d0 6f 6d 20 20 20 20 20 57 68 69 63 68 20 74 65 72  om     Which ter
304e0 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
304f0 61 75 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f  ause is being co
30500 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  ded.  **   pWInf
30510 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20  o->a[].iTabCur  
30520 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
30530 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
30540 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70  e table.  **   p
30550 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43  WInfo->a[].iIdxC
30560 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
30570 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
30580 65 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ex.  **   pWInfo
30590 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20  ->a[].pTerm     
305a0 57 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f  When wsFlags==WO
305b0 5f 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75  _OR, the OR-clau
305c0 73 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a  se term.  **.  *
305d0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
305e0 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65   figures out the
305f0 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f   nesting order o
30600 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
30610 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65  FROM.  ** clause
30620 2e 0a 20 20 2a 2f 0a 20 20 73 57 42 49 2e 6e 6f  ..  */.  sWBI.no
30630 74 56 61 6c 69 64 20 3d 20 7e 28 42 69 74 6d 61  tValid = ~(Bitma
30640 73 6b 29 30 3b 0a 20 20 73 57 42 49 2e 70 4f 72  sk)0;.  sWBI.pOr
30650 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
30660 3b 0a 20 20 73 57 42 49 2e 6e 20 3d 20 6e 54 61  ;.  sWBI.n = nTa
30670 62 4c 69 73 74 3b 0a 20 20 73 57 42 49 2e 70 44  bList;.  sWBI.pD
30680 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
30690 6e 63 74 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20  nct;.  andFlags 
306a0 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41  = ~0;.  WHERETRA
306b0 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
306c0 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29  er Start ***\n")
306d0 29 3b 0a 20 20 66 6f 72 28 73 57 42 49 2e 69 3d  );.  for(sWBI.i=
306e0 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d  iFrom=0, pLevel=
306f0 70 57 49 6e 66 6f 2d 3e 61 3b 20 73 57 42 49 2e  pWInfo->a; sWBI.
30700 69 3c 6e 54 61 62 4c 69 73 74 3b 20 73 57 42 49  i<nTabList; sWBI
30710 2e 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  .i++, pLevel++){
30720 0a 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 62  .    WhereCost b
30730 65 73 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20  estPlan;        
30740 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65   /* Most efficie
30750 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20  nt plan seen so 
30760 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  far */.    Index
30770 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
30780 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30790 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61  for FROM table a
307a0 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20  t pTabItem */.  
307b0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
307c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
307d0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
307e0 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f  r FROM tables */
307f0 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d  .    int bestJ =
30800 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
30810 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
30820 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73   j */.    Bitmas
30830 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  k m;            
30840 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
30850 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20   value for j or 
30860 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74  bestJ */.    int
30870 20 69 73 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20   isOptimal;     
30880 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
30890 61 74 6f 72 20 66 6f 72 20 6f 70 74 69 6d 61 6c  ator for optimal
308a0 2f 6e 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73 65 61  /non-optimal sea
308b0 72 63 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63  rch */.    int c
308c0 6b 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20 20 20  kOptimal;       
308d0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 74 68 65         /* Do the
308e0 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 63 68   optimal scan ch
308f0 65 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  eck */.    int n
30900 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3b 20 20  Unconstrained;  
30910 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30920 20 74 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20   tables without 
30930 49 4e 44 45 58 45 44 20 42 59 20 2a 2f 0a 20 20  INDEXED BY */.  
30940 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 49 6e 64    Bitmask notInd
30950 65 78 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  exed;         /*
30960 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20   Mask of tables 
30970 74 68 61 74 20 63 61 6e 6e 6f 74 20 75 73 65 20  that cannot use 
30980 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20  an index */..   
30990 20 6d 65 6d 73 65 74 28 26 62 65 73 74 50 6c 61   memset(&bestPla
309a0 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 65 73  n, 0, sizeof(bes
309b0 74 50 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65 73  tPlan));.    bes
309c0 74 50 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51  tPlan.rCost = SQ
309d0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20  LITE_BIG_DBL;.  
309e0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
309f0 2a 2a 20 42 65 67 69 6e 20 73 65 61 72 63 68 20  ** Begin search 
30a00 66 6f 72 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c  for loop %d ***\
30a10 6e 22 2c 20 73 57 42 49 2e 69 29 29 3b 0a 0a 20  n", sWBI.i));.. 
30a20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
30a30 67 68 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  gh the remaining
30a40 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
30a50 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 66  FROM clause to f
30a60 69 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ind the.    ** n
30a70 65 78 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e  ext nested loop.
30a80 20 54 68 65 20 6c 6f 6f 70 20 74 65 73 74 73 20   The loop tests 
30a90 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
30aa0 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 65  entries.    ** e
30ab0 69 74 68 65 72 20 6f 6e 63 65 20 6f 72 20 74 77  ither once or tw
30ac0 69 63 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ice. .    **.   
30ad0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 65   ** The first te
30ae0 73 74 20 69 73 20 61 6c 77 61 79 73 20 70 65 72  st is always per
30af0 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65 20  formed if there 
30b00 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
30b10 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 72  entries.    ** r
30b20 65 6d 61 69 6e 69 6e 67 20 61 6e 64 20 6e 65 76  emaining and nev
30b30 65 72 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  er performed if 
30b40 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  there is only on
30b50 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  e FROM clause en
30b60 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f 20 63 68  try.    ** to ch
30b70 6f 6f 73 65 20 66 72 6f 6d 2e 20 20 54 68 65 20  oose from.  The 
30b80 66 69 72 73 74 20 74 65 73 74 20 6c 6f 6f 6b 73  first test looks
30b90 20 66 6f 72 20 61 6e 20 22 6f 70 74 69 6d 61 6c   for an "optimal
30ba0 22 20 73 63 61 6e 2e 20 20 49 6e 0a 20 20 20 20  " scan.  In.    
30bb0 2a 2a 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20  ** this context 
30bc0 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20  an optimal scan 
30bd0 69 73 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73  is one that uses
30be0 20 74 68 65 20 73 61 6d 65 20 73 74 72 61 74 65   the same strate
30bf0 67 79 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  gy.    ** for th
30c00 65 20 67 69 76 65 6e 20 46 52 4f 4d 20 63 6c 61  e given FROM cla
30c10 75 73 65 20 65 6e 74 72 79 20 61 73 20 77 6f 75  use entry as wou
30c20 6c 64 20 62 65 20 73 65 6c 65 63 74 65 64 20 69  ld be selected i
30c30 66 20 74 68 65 20 65 6e 74 72 79 0a 20 20 20 20  f the entry.    
30c40 2a 2a 20 77 65 72 65 20 75 73 65 64 20 61 73 20  ** were used as 
30c50 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6e 65  the innermost ne
30c60 73 74 65 64 20 6c 6f 6f 70 2e 20 20 49 6e 20 6f  sted loop.  In o
30c70 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 74 61  ther words, a ta
30c80 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 63 68  ble.    ** is ch
30c90 6f 73 65 6e 20 73 75 63 68 20 74 68 61 74 20 74  osen such that t
30ca0 68 65 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e 69  he cost of runni
30cb0 6e 67 20 74 68 61 74 20 74 61 62 6c 65 20 63 61  ng that table ca
30cc0 6e 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64 0a  nnot be reduced.
30cd0 20 20 20 20 2a 2a 20 62 79 20 77 61 69 74 69 6e      ** by waitin
30ce0 67 20 66 6f 72 20 6f 74 68 65 72 20 74 61 62 6c  g for other tabl
30cf0 65 73 20 74 6f 20 72 75 6e 20 66 69 72 73 74 2e  es to run first.
30d00 20 20 54 68 69 73 20 22 6f 70 74 69 6d 61 6c 22    This "optimal"
30d10 20 74 65 73 74 20 77 6f 72 6b 73 0a 20 20 20 20   test works.    
30d20 2a 2a 20 62 79 20 66 69 72 73 74 20 61 73 73 75  ** by first assu
30d30 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 46 52  ming that the FR
30d40 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6f 6e 20  OM clause is on 
30d50 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61  the inner loop a
30d60 6e 64 20 66 69 6e 64 69 6e 67 0a 20 20 20 20 2a  nd finding.    *
30d70 2a 20 69 74 73 20 71 75 65 72 79 20 70 6c 61 6e  * its query plan
30d80 2c 20 74 68 65 6e 20 63 68 65 63 6b 69 6e 67 20  , then checking 
30d90 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 20 71  to see if that q
30da0 75 65 72 79 20 70 6c 61 6e 20 75 73 65 73 20 61  uery plan uses a
30db0 6e 79 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  ny.    ** other 
30dc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
30dd0 73 20 74 68 61 74 20 61 72 65 20 73 57 42 49 2e  s that are sWBI.
30de0 6e 6f 74 56 61 6c 69 64 2e 20 20 49 66 20 6e 6f  notValid.  If no
30df0 20 6e 6f 74 56 61 6c 69 64 20 74 65 72 6d 73 0a   notValid terms.
30e00 20 20 20 20 2a 2a 20 61 72 65 20 75 73 65 64 20      ** are used 
30e10 74 68 65 6e 20 74 68 65 20 22 6f 70 74 69 6d 61  then the "optima
30e20 6c 22 20 71 75 65 72 79 20 70 6c 61 6e 20 77 6f  l" query plan wo
30e30 72 6b 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rks..    **.    
30e40 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
30e50 20 57 68 65 72 65 43 6f 73 74 2e 6e 52 6f 77 20   WhereCost.nRow 
30e60 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
30e70 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 6d 69   optimal scan mi
30e80 67 68 74 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 62  ght.    ** not b
30e90 65 20 61 73 20 73 6d 61 6c 6c 20 61 73 20 69 74  e as small as it
30ea0 20 77 6f 75 6c 64 20 62 65 20 69 66 20 74 68 65   would be if the
30eb0 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 77 65   table really we
30ec0 72 65 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74  re the innermost
30ed0 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 2e 20 20 54  .    ** join.  T
30ee0 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 63 61  he nRow value ca
30ef0 6e 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20  n be reduced by 
30f00 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
30f10 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20  straints.    ** 
30f20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20  that do not use 
30f30 69 6e 64 69 63 65 73 2e 20 20 42 75 74 20 74 68  indices.  But th
30f40 69 73 20 6e 52 6f 77 20 72 65 64 75 63 74 69 6f  is nRow reductio
30f50 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  n only happens i
30f60 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62  f the.    ** tab
30f70 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
30f80 20 69 6e 6e 65 72 6d 6f 73 74 20 6a 6f 69 6e 2e   innermost join.
30f90 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a    .    **.    **
30fa0 20 54 68 65 20 73 65 63 6f 6e 64 20 6c 6f 6f 70   The second loop
30fb0 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 6f 6e   iteration is on
30fc0 6c 79 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  ly performed if 
30fd0 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 0a  no optimal scan.
30fe0 20 20 20 20 2a 2a 20 73 74 72 61 74 65 67 69 65      ** strategie
30ff0 73 20 77 65 72 65 20 66 6f 75 6e 64 20 62 79 20  s were found by 
31000 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
31010 69 6f 6e 2e 20 54 68 69 73 20 73 65 63 6f 6e 64  ion. This second
31020 20 69 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a   iteration.    *
31030 2a 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 61  * is used to sea
31040 72 63 68 20 66 6f 72 20 74 68 65 20 6c 6f 77 65  rch for the lowe
31050 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f 76 65  st cost scan ove
31060 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rall..    **.   
31070 20 2a 2a 20 57 69 74 68 6f 75 74 20 74 68 65 20   ** Without the 
31080 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 73 74 65  optimal scan ste
31090 70 20 28 74 68 65 20 66 69 72 73 74 20 69 74 65  p (the first ite
310a0 72 61 74 69 6f 6e 29 20 61 20 73 75 62 6f 70 74  ration) a subopt
310b0 69 6d 61 6c 0a 20 20 20 20 2a 2a 20 70 6c 61 6e  imal.    ** plan
310c0 20 6d 69 67 68 74 20 62 65 20 63 68 6f 73 65 6e   might be chosen
310d0 20 66 6f 72 20 71 75 65 72 69 65 73 20 6c 69 6b   for queries lik
310e0 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 20 20  e this:.    **  
310f0 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54   .    **   CREAT
31100 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
31110 3b 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  ; .    **   CREA
31120 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c 20 64  TE TABLE t2(c, d
31130 29 3b 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  );.    **   SELE
31140 43 54 20 2a 20 46 52 4f 4d 20 74 32 2c 20 74 31  CT * FROM t2, t1
31150 20 57 48 45 52 45 20 74 32 2e 72 6f 77 69 64 20   WHERE t2.rowid 
31160 3d 20 74 31 2e 61 3b 0a 20 20 20 20 2a 2a 0a 20  = t1.a;.    **. 
31170 20 20 20 2a 2a 20 54 68 65 20 62 65 73 74 20 73     ** The best s
31180 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 69 74  trategy is to it
31190 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 61  erate through ta
311a0 62 6c 65 20 74 31 20 66 69 72 73 74 2e 20 48 6f  ble t1 first. Ho
311b0 77 65 76 65 72 20 69 74 0a 20 20 20 20 2a 2a 20  wever it.    ** 
311c0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
311d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69  to determine thi
311e0 73 20 77 69 74 68 20 61 20 73 69 6d 70 6c 65 20  s with a simple 
311f0 67 72 65 65 64 79 20 61 6c 67 6f 72 69 74 68 6d  greedy algorithm
31200 2e 0a 20 20 20 20 2a 2a 20 53 69 6e 63 65 20 74  ..    ** Since t
31210 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e  he cost of a lin
31220 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
31230 20 74 61 62 6c 65 20 74 32 20 69 73 20 74 68 65   table t2 is the
31240 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20 61 73   same .    ** as
31250 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c   the cost of a l
31260 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
31270 67 68 20 74 61 62 6c 65 20 74 31 2c 20 61 20 73  gh table t1, a s
31280 69 6d 70 6c 65 20 67 72 65 65 64 79 20 0a 20 20  imple greedy .  
31290 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 20 6d    ** algorithm m
312a0 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 75 73 65  ay choose to use
312b0 20 74 32 20 66 6f 72 20 74 68 65 20 6f 75 74 65   t2 for the oute
312c0 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68 20 69 73  r loop, which is
312d0 20 61 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20 63   a much.    ** c
312e0 6f 73 74 6c 69 65 72 20 61 70 70 72 6f 61 63 68  ostlier approach
312f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 55 6e  ..    */.    nUn
31300 63 6f 6e 73 74 72 61 69 6e 65 64 20 3d 20 30 3b  constrained = 0;
31310 0a 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64 20  .    notIndexed 
31320 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  = 0;..    /* The
31330 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 63 68   optimal scan ch
31340 65 63 6b 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  eck only occurs 
31350 69 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  if there are two
31360 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 0a   or more tables.
31370 20 20 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65      ** available
31380 20 74 6f 20 62 65 20 72 65 6f 72 64 65 72 65 64   to be reordered
31390 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 6f   */.    if( iFro
313a0 6d 3d 3d 6e 54 61 62 4c 69 73 74 2d 31 20 29 7b  m==nTabList-1 ){
313b0 0a 20 20 20 20 20 20 63 6b 4f 70 74 69 6d 61 6c  .      ckOptimal
313c0 20 3d 20 30 3b 20 20 2f 2a 20 43 6f 6d 6d 6f 6e   = 0;  /* Common
313d0 20 63 61 73 65 20 6f 66 20 6a 75 73 74 20 6f 6e   case of just on
313e0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
313f0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
31400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
31410 6b 4f 70 74 69 6d 61 6c 20 3d 20 2d 31 3b 0a 20  kOptimal = -1;. 
31420 20 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d       for(j=iFrom
31430 2c 20 73 57 42 49 2e 70 53 72 63 3d 26 70 54 61  , sWBI.pSrc=&pTa
31440 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e  bList->a[j]; j<n
31450 54 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20 73 57  TabList; j++, sW
31460 42 49 2e 70 53 72 63 2b 2b 29 7b 0a 20 20 20 20  BI.pSrc++){.    
31470 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28      m = getMask(
31480 70 4d 61 73 6b 53 65 74 2c 20 73 57 42 49 2e 70  pMaskSet, sWBI.p
31490 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  Src->iCursor);. 
314a0 20 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20         if( (m & 
314b0 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d  sWBI.notValid)==
314c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
314d0 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46  f( j==iFrom ) iF
314e0 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  rom++;.         
314f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
31510 20 6a 3e 69 46 72 6f 6d 20 26 26 20 28 73 57 42   j>iFrom && (sWB
31520 49 2e 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65  I.pSrc->jointype
31530 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
31540 52 4f 53 53 29 29 21 3d 30 20 29 20 62 72 65 61  ROSS))!=0 ) brea
31550 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2b  k;.        if( +
31560 2b 63 6b 4f 70 74 69 6d 61 6c 20 29 20 62 72 65  +ckOptimal ) bre
31570 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
31580 28 73 57 42 49 2e 70 53 72 63 2d 3e 6a 6f 69 6e  (sWBI.pSrc->join
31590 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
315a0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
315b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
315c0 73 65 72 74 28 20 63 6b 4f 70 74 69 6d 61 6c 3d  sert( ckOptimal=
315d0 3d 30 20 7c 7c 20 63 6b 4f 70 74 69 6d 61 6c 3d  =0 || ckOptimal=
315e0 3d 31 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  =1 );..    for(i
315f0 73 4f 70 74 69 6d 61 6c 3d 63 6b 4f 70 74 69 6d  sOptimal=ckOptim
31600 61 6c 3b 20 69 73 4f 70 74 69 6d 61 6c 3e 3d 30  al; isOptimal>=0
31610 20 26 26 20 62 65 73 74 4a 3c 30 3b 20 69 73 4f   && bestJ<0; isO
31620 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20  ptimal--){.     
31630 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 73 57   for(j=iFrom, sW
31640 42 49 2e 70 53 72 63 3d 26 70 54 61 62 4c 69 73  BI.pSrc=&pTabLis
31650 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c  t->a[j]; j<nTabL
31660 69 73 74 3b 20 6a 2b 2b 2c 20 73 57 42 49 2e 70  ist; j++, sWBI.p
31670 53 72 63 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Src++){.        
31680 69 66 28 20 6a 3e 69 46 72 6f 6d 20 26 26 20 28  if( j>iFrom && (
31690 73 57 42 49 2e 70 53 72 63 2d 3e 6a 6f 69 6e 74  sWBI.pSrc->joint
316a0 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
316b0 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a  T_CROSS))!=0 ){.
316c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
316d0 73 20 62 72 65 61 6b 20 61 6e 64 20 6f 6e 65 20  s break and one 
316e0 6c 69 6b 65 20 69 74 20 69 6e 20 74 68 65 20 63  like it in the c
316f0 6b 4f 70 74 69 6d 61 6c 20 63 6f 6d 70 75 74 61  kOptimal computa
31700 74 69 6f 6e 20 6c 6f 6f 70 0a 20 20 20 20 20 20  tion loop.      
31710 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 70 72 65      ** above pre
31720 76 65 6e 74 20 74 61 62 6c 65 20 72 65 6f 72 64  vent table reord
31730 65 72 69 6e 67 20 61 63 72 6f 73 73 20 4c 45 46  ering across LEF
31740 54 20 61 6e 64 20 43 52 4f 53 53 20 4a 4f 49 4e  T and CROSS JOIN
31750 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s..          ** 
31760 54 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  The LEFT JOIN ca
31770 73 65 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  se is necessary 
31780 66 6f 72 20 63 6f 72 72 65 63 74 6e 65 73 73 2e  for correctness.
31790 20 20 54 68 65 20 70 72 6f 68 69 62 69 74 69 6f    The prohibitio
317a0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
317b0 67 61 69 6e 73 74 20 72 65 6f 72 64 65 72 69 6e  gainst reorderin
317c0 67 20 61 63 72 6f 73 73 20 61 20 43 52 4f 53 53  g across a CROSS
317d0 20 4a 4f 49 4e 20 69 73 20 61 6e 20 53 51 4c 69   JOIN is an SQLi
317e0 74 65 20 66 65 61 74 75 72 65 20 74 68 61 74 0a  te feature that.
317f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c            ** all
31800 6f 77 73 20 74 68 65 20 64 65 76 65 6c 6f 70 65  ows the develope
31810 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 61 62  r to control tab
31820 6c 65 20 72 65 6f 72 64 65 72 69 6e 67 20 2a 2f  le reordering */
31830 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
31840 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31850 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28      m = getMask(
31860 70 4d 61 73 6b 53 65 74 2c 20 73 57 42 49 2e 70  pMaskSet, sWBI.p
31870 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  Src->iCursor);. 
31880 20 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20         if( (m & 
31890 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d  sWBI.notValid)==
318a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
318b0 73 73 65 72 74 28 20 6a 3e 69 46 72 6f 6d 20 29  ssert( j>iFrom )
318c0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
318d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
318e0 20 20 20 20 20 20 20 20 73 57 42 49 2e 6e 6f 74          sWBI.not
318f0 52 65 61 64 79 20 3d 20 28 69 73 4f 70 74 69 6d  Ready = (isOptim
31900 61 6c 20 3f 20 6d 20 3a 20 73 57 42 49 2e 6e 6f  al ? m : sWBI.no
31910 74 56 61 6c 69 64 29 3b 0a 20 20 20 20 20 20 20  tValid);.       
31920 20 69 66 28 20 73 57 42 49 2e 70 53 72 63 2d 3e   if( sWBI.pSrc->
31930 70 49 6e 64 65 78 3d 3d 30 20 29 20 6e 55 6e 63  pIndex==0 ) nUnc
31940 6f 6e 73 74 72 61 69 6e 65 64 2b 2b 3b 0a 20 20  onstrained++;.  
31950 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
31960 41 43 45 28 28 22 20 20 20 3d 3d 3d 20 74 72 79  ACE(("   === try
31970 69 6e 67 20 74 61 62 6c 65 20 25 64 20 28 25 73  ing table %d (%s
31980 29 20 77 69 74 68 20 69 73 4f 70 74 69 6d 61 6c  ) with isOptimal
31990 3d 25 64 20 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20  =%d ===\n",.    
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 6a 2c 20 73 57 42 49 2e 70 53 72 63 2d 3e 70 54  j, sWBI.pSrc->pT
319c0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 69 73 4f 70 74  ab->zName, isOpt
319d0 69 6d 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  imal));.        
319e0 61 73 73 65 72 74 28 20 73 57 42 49 2e 70 53 72  assert( sWBI.pSr
319f0 63 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64  c->pTab );.#ifnd
31a00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
31a10 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
31a20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
31a30 6c 28 73 57 42 49 2e 70 53 72 63 2d 3e 70 54 61  l(sWBI.pSrc->pTa
31a40 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
31a50 73 57 42 49 2e 70 70 49 64 78 49 6e 66 6f 20 3d  sWBI.ppIdxInfo =
31a60 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70   &pWInfo->a[j].p
31a70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  IdxInfo;.       
31a80 20 20 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e     bestVirtualIn
31a90 64 65 78 28 26 73 57 42 49 29 3b 0a 20 20 20 20  dex(&sWBI);.    
31aa0 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69      }else .#endi
31ab0 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
31ac0 20 20 20 20 20 20 62 65 73 74 42 74 72 65 65 49        bestBtreeI
31ad0 6e 64 65 78 28 26 73 57 42 49 29 3b 0a 20 20 20  ndex(&sWBI);.   
31ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
31af0 73 73 65 72 74 28 20 69 73 4f 70 74 69 6d 61 6c  ssert( isOptimal
31b00 20 7c 7c 20 28 73 57 42 49 2e 63 6f 73 74 2e 75   || (sWBI.cost.u
31b10 73 65 64 26 73 57 42 49 2e 6e 6f 74 56 61 6c 69  sed&sWBI.notVali
31b20 64 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  d)==0 );..      
31b30 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58    /* If an INDEX
31b40 45 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ED BY clause is 
31b50 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68  present, then th
31b60 65 20 70 6c 61 6e 20 6d 75 73 74 20 75 73 65 20  e plan must use 
31b70 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
31b80 69 6e 64 65 78 20 69 66 20 69 74 20 75 73 65 73  index if it uses
31b90 20 61 6e 79 20 69 6e 64 65 78 20 61 74 20 61 6c   any index at al
31ba0 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  l */.        ass
31bb0 65 72 74 28 20 73 57 42 49 2e 70 53 72 63 2d 3e  ert( sWBI.pSrc->
31bc0 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20  pIndex==0 .     
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
31be0 28 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e  (sWBI.cost.plan.
31bf0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
31c00 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
31c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31c20 20 20 20 7c 7c 20 73 57 42 49 2e 63 6f 73 74 2e     || sWBI.cost.
31c30 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 73 57 42  plan.u.pIdx==sWB
31c40 49 2e 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  I.pSrc->pIndex )
31c50 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ;..        if( i
31c60 73 4f 70 74 69 6d 61 6c 20 26 26 20 28 73 57 42  sOptimal && (sWB
31c70 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  I.cost.plan.wsFl
31c80 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
31c90 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a  FULLSCAN)==0 ){.
31ca0 20 20 20 20 20 20 20 20 20 20 6e 6f 74 49 6e 64            notInd
31cb0 65 78 65 64 20 7c 3d 20 6d 3b 0a 20 20 20 20 20  exed |= m;.     
31cc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
31cd0 20 69 73 4f 70 74 69 6d 61 6c 20 29 7b 0a 20 20   isOptimal ){.  
31ce0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
31cf0 61 5b 6a 5d 2e 72 4f 70 74 43 6f 73 74 20 3d 20  a[j].rOptCost = 
31d00 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f 73 74 3b  sWBI.cost.rCost;
31d10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
31d20 66 28 20 63 6b 4f 70 74 69 6d 61 6c 20 29 7b 0a  f( ckOptimal ){.
31d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
31d40 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c  two or more tabl
31d50 65 73 20 68 61 76 65 20 6e 65 61 72 6c 79 20 74  es have nearly t
31d60 68 65 20 73 61 6d 65 20 6f 75 74 65 72 20 6c 6f  he same outer lo
31d70 6f 70 20 63 6f 73 74 2c 20 62 75 74 0a 20 20 20  op cost, but.   
31d80 20 20 20 20 20 20 20 2a 2a 20 76 65 72 79 20 64         ** very d
31d90 69 66 66 65 72 65 6e 74 20 69 6e 6e 65 72 20 6c  ifferent inner l
31da0 6f 6f 70 20 28 6f 70 74 69 6d 61 6c 29 20 63 6f  oop (optimal) co
31db0 73 74 2c 20 77 65 20 77 61 6e 74 20 74 6f 20 63  st, we want to c
31dc0 68 6f 6f 73 65 0a 20 20 20 20 20 20 20 20 20 20  hoose.          
31dd0 2a 2a 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72  ** for the outer
31de0 20 6c 6f 6f 70 20 74 68 61 74 20 74 61 62 6c 65   loop that table
31df0 20 77 68 69 63 68 20 62 65 6e 65 66 69 74 73 20   which benefits 
31e00 74 68 65 20 6c 65 61 73 74 20 66 72 6f 6d 0a 20  the least from. 
31e10 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e           ** bein
31e20 67 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  g in the inner l
31e30 6f 6f 70 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oop.  The follow
31e40 69 6e 67 20 63 6f 64 65 20 73 63 61 6c 65 73 20  ing code scales 
31e50 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  the .          *
31e60 2a 20 6f 75 74 65 72 20 6c 6f 6f 70 20 63 6f 73  * outer loop cos
31e70 74 20 65 73 74 69 6d 61 74 65 20 74 6f 20 61 63  t estimate to ac
31e80 63 6f 6d 70 6c 69 73 68 20 74 68 61 74 2e 20 2a  complish that. *
31e90 2f 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  /.          WHER
31ea0 45 54 52 41 43 45 28 28 22 20 20 20 73 63 61 6c  ETRACE(("   scal
31eb0 69 6e 67 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e  ing cost from %.
31ec0 31 66 20 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20  1f to %.1f\n",. 
31ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ee0 20 20 20 20 20 73 57 42 49 2e 63 6f 73 74 2e 72       sWBI.cost.r
31ef0 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cost,.          
31f00 20 20 20 20 20 20 20 20 20 20 20 20 73 57 42 49              sWBI
31f10 2e 63 6f 73 74 2e 72 43 6f 73 74 2f 70 57 49 6e  .cost.rCost/pWIn
31f20 66 6f 2d 3e 61 5b 6a 5d 2e 72 4f 70 74 43 6f 73  fo->a[j].rOptCos
31f30 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  t));.          s
31f40 57 42 49 2e 63 6f 73 74 2e 72 43 6f 73 74 20 2f  WBI.cost.rCost /
31f50 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 72  = pWInfo->a[j].r
31f60 4f 70 74 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  OptCost;.       
31f70 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   }..        /* C
31f80 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72 20  onditions under 
31f90 77 68 69 63 68 20 74 68 69 73 20 74 61 62 6c 65  which this table
31fa0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 62 65 73   becomes the bes
31fb0 74 20 73 6f 20 66 61 72 3a 0a 20 20 20 20 20 20  t so far:.      
31fc0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
31fd0 20 20 28 31 29 20 54 68 65 20 74 61 62 6c 65 20    (1) The table 
31fe0 6d 75 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20  must not depend 
31ff0 6f 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  on other tables 
32000 74 68 61 74 20 68 61 76 65 20 6e 6f 74 0a 20 20  that have not.  
32010 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 79        **       y
32020 65 74 20 72 75 6e 2e 20 20 28 49 6e 20 6f 74 68  et run.  (In oth
32030 65 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75 73  er words, it mus
32040 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20  t not depend on 
32050 74 61 62 6c 65 73 0a 20 20 20 20 20 20 20 20 2a  tables.        *
32060 2a 20 20 20 20 20 20 20 69 6e 20 69 6e 6e 65 72  *       in inner
32070 20 6c 6f 6f 70 73 2e 29 0a 20 20 20 20 20 20 20   loops.).       
32080 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
32090 20 28 32 29 20 28 54 68 69 73 20 72 75 6c 65 20   (2) (This rule 
320a0 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32  was removed on 2
320b0 30 31 32 2d 31 31 2d 30 39 2e 20 20 54 68 65 20  012-11-09.  The 
320c0 73 63 61 6c 69 6e 67 20 6f 66 20 74 68 65 0a 20  scaling of the. 
320d0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
320e0 63 6f 73 74 20 75 73 69 6e 67 20 74 68 65 20 6f  cost using the o
320f0 70 74 69 6d 61 6c 20 73 63 61 6e 20 63 6f 73 74  ptimal scan cost
32100 20 6d 61 64 65 20 74 68 69 73 20 72 75 6c 65 20   made this rule 
32110 6f 62 73 6f 6c 65 74 65 2e 29 0a 20 20 20 20 20  obsolete.).     
32120 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
32130 20 20 20 28 33 29 20 41 6c 6c 20 74 61 62 6c 65     (3) All table
32140 73 20 68 61 76 65 20 61 6e 20 49 4e 44 45 58 45  s have an INDEXE
32150 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 74  D BY clause or t
32160 68 69 73 20 74 61 62 6c 65 20 6c 61 63 6b 73 20  his table lacks 
32170 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  an.        **   
32180 20 20 20 20 49 4e 44 45 58 45 44 20 42 59 20 63      INDEXED BY c
32190 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20 74 61  lause or this ta
321a0 62 6c 65 20 75 73 65 73 20 74 68 65 20 73 70 65  ble uses the spe
321b0 63 69 66 69 63 0a 20 20 20 20 20 20 20 20 2a 2a  cific.        **
321c0 20 20 20 20 20 20 20 69 6e 64 65 78 20 73 70 65         index spe
321d0 63 69 66 69 65 64 20 62 79 20 69 74 73 20 49 4e  cified by its IN
321e0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
321f0 20 20 54 68 69 73 20 72 75 6c 65 20 65 6e 73 75    This rule ensu
32200 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  res.        **  
32210 20 20 20 20 20 74 68 61 74 20 61 20 62 65 73 74       that a best
32220 2d 73 6f 2d 66 61 72 20 69 73 20 61 6c 77 61 79  -so-far is alway
32230 73 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e 20  s selected even 
32240 69 66 20 61 6e 20 69 6d 70 6f 73 73 69 62 6c 65  if an impossible
32250 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
32260 20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66    combination of
32270 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
32280 73 65 73 20 61 72 65 20 67 69 76 65 6e 2e 20 20  ses are given.  
32290 54 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  The error.      
322a0 20 20 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c 20    **       will 
322b0 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20  be detected and 
322c0 72 65 6c 61 79 65 64 20 62 61 63 6b 20 74 6f 20  relayed back to 
322d0 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
322e0 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  later..        *
322f0 2a 20 20 20 20 20 20 20 54 68 65 20 4e 45 56 45  *       The NEVE
32300 52 28 29 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  R() comes about 
32310 62 65 63 61 75 73 65 20 72 75 6c 65 20 28 32 29  because rule (2)
32320 20 61 62 6f 76 65 20 70 72 65 76 65 6e 74 73 0a   above prevents.
32330 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
32340 20 41 6e 20 69 6e 64 65 78 61 62 6c 65 20 66 75   An indexable fu
32350 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 66 72  ll-table-scan fr
32360 6f 6d 20 72 65 61 63 68 69 6e 67 20 72 75 6c 65  om reaching rule
32370 20 28 33 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a   (3)..        **
32380 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 34  .        **   (4
32390 29 20 54 68 65 20 70 6c 61 6e 20 63 6f 73 74 20  ) The plan cost 
323a0 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 20 74 68  must be lower th
323b0 61 6e 20 70 72 69 6f 72 20 70 6c 61 6e 73 2c 20  an prior plans, 
323c0 77 68 65 72 65 20 22 63 6f 73 74 22 0a 20 20 20  where "cost".   
323d0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 73       **       is
323e0 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20   defined by the 
323f0 63 6f 6d 70 61 72 65 43 6f 73 74 28 29 20 66 75  compareCost() fu
32400 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 20 0a 20  nction above. . 
32410 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32420 20 20 69 66 28 20 28 73 57 42 49 2e 63 6f 73 74    if( (sWBI.cost
32430 2e 75 73 65 64 26 73 57 42 49 2e 6e 6f 74 56 61  .used&sWBI.notVa
32440 6c 69 64 29 3d 3d 30 20 20 20 20 20 20 20 20 20  lid)==0         
32450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
32460 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
32470 20 26 26 20 28 6e 55 6e 63 6f 6e 73 74 72 61 69   && (nUnconstrai
32480 6e 65 64 3d 3d 30 20 7c 7c 20 73 57 42 49 2e 70  ned==0 || sWBI.p
32490 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 20  Src->pIndex==0  
324a0 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a        /* (3) */.
324b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324c0 7c 7c 20 4e 45 56 45 52 28 28 73 57 42 49 2e 63  || NEVER((sWBI.c
324d0 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
324e0 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
324f0 4c 53 43 41 4e 29 21 3d 30 29 29 0a 20 20 20 20  LSCAN)!=0)).    
32500 20 20 20 20 20 20 20 20 26 26 20 28 62 65 73 74          && (best
32510 4a 3c 30 20 7c 7c 20 63 6f 6d 70 61 72 65 43 6f  J<0 || compareCo
32520 73 74 28 26 73 57 42 49 2e 63 6f 73 74 2c 20 26  st(&sWBI.cost, &
32530 62 65 73 74 50 6c 61 6e 29 29 20 20 20 2f 2a 20  bestPlan))   /* 
32540 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (4) */.        )
32550 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  {.          WHER
32560 45 54 52 41 43 45 28 28 22 20 20 20 3d 3d 3d 20  ETRACE(("   === 
32570 74 61 62 6c 65 20 25 64 20 28 25 73 29 20 69 73  table %d (%s) is
32580 20 62 65 73 74 20 73 6f 20 66 61 72 5c 6e 22 0a   best so far\n".
32590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325a0 20 20 20 20 20 20 22 20 20 20 20 20 20 20 63 6f        "       co
325b0 73 74 3d 25 2e 31 66 2c 20 6e 52 6f 77 3d 25 2e  st=%.1f, nRow=%.
325c0 31 66 2c 20 6e 4f 42 53 61 74 3d 25 64 2c 20 77  1f, nOBSat=%d, w
325d0 73 46 6c 61 67 73 3d 25 30 38 78 5c 6e 22 2c 0a  sFlags=%08x\n",.
325e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325f0 20 20 20 20 20 20 6a 2c 20 73 57 42 49 2e 70 53        j, sWBI.pS
32600 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  rc->pTab->zName,
32610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32620 20 20 20 20 20 20 20 73 57 42 49 2e 63 6f 73 74         sWBI.cost
32630 2e 72 43 6f 73 74 2c 20 73 57 42 49 2e 63 6f 73  .rCost, sWBI.cos
32640 74 2e 70 6c 61 6e 2e 6e 52 6f 77 2c 0a 20 20 20  t.plan.nRow,.   
32650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32660 20 20 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61     sWBI.cost.pla
32670 6e 2e 6e 4f 42 53 61 74 2c 20 73 57 42 49 2e 63  n.nOBSat, sWBI.c
32680 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
32690 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  ));.          be
326a0 73 74 50 6c 61 6e 20 3d 20 73 57 42 49 2e 63 6f  stPlan = sWBI.co
326b0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  st;.          be
326c0 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  stJ = j;.       
326d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   }..        /* I
326e0 6e 20 61 20 6a 6f 69 6e 20 6c 69 6b 65 20 22 77  n a join like "w
326f0 20 4a 4f 49 4e 20 78 20 4c 45 46 54 20 4a 4f 49   JOIN x LEFT JOI
32700 4e 20 79 20 4a 4f 49 4e 20 7a 22 20 20 6d 61 6b  N y JOIN z"  mak
32710 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 20 20  e sure that.    
32720 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 79 20 28      ** table y (
32730 61 6e 64 20 6e 6f 74 20 74 61 62 6c 65 20 7a 29  and not table z)
32740 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e   is always the n
32750 65 78 74 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69  ext inner loop i
32760 6e 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a  nside.        **
32770 20 6f 66 20 74 61 62 6c 65 20 78 2e 20 2a 2f 0a   of table x. */.
32780 20 20 20 20 20 20 20 20 69 66 28 20 28 73 57 42          if( (sWB
32790 49 2e 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65  I.pSrc->jointype
327a0 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
327b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
327c0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
327d0 28 20 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20  ( bestJ>=0 );.  
327e0 20 20 61 73 73 65 72 74 28 20 73 57 42 49 2e 6e    assert( sWBI.n
327f0 6f 74 56 61 6c 69 64 20 26 20 67 65 74 4d 61 73  otValid & getMas
32800 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
32810 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
32820 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 61  Cursor) );.    a
32830 73 73 65 72 74 28 20 62 65 73 74 4a 3d 3d 69 46  ssert( bestJ==iF
32840 72 6f 6d 20 7c 7c 20 28 70 54 61 62 4c 69 73 74  rom || (pTabList
32850 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
32860 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d  ype & JT_LEFT)==
32870 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
32880 65 28 20 62 65 73 74 4a 3e 69 46 72 6f 6d 20 26  e( bestJ>iFrom &
32890 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  & (pTabList->a[i
328a0 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  From].jointype &
328b0 20 4a 54 5f 43 52 4f 53 53 29 21 3d 30 20 29 3b   JT_CROSS)!=0 );
328c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62  .    testcase( b
328d0 65 73 74 4a 3e 69 46 72 6f 6d 20 26 26 20 62 65  estJ>iFrom && be
328e0 73 74 4a 3c 6e 54 61 62 4c 69 73 74 2d 31 0a 20  stJ<nTabList-1. 
328f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32900 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 61           && (pTa
32910 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 2b 31  bList->a[bestJ+1
32920 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
32930 4c 45 46 54 29 21 3d 30 20 29 3b 0a 20 20 20 20  LEFT)!=0 );.    
32940 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
32950 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65 63   Optimizer selec
32960 74 73 20 74 61 62 6c 65 20 25 64 20 28 25 73 29  ts table %d (%s)
32970 20 66 6f 72 20 6c 6f 6f 70 20 25 64 20 77 69 74   for loop %d wit
32980 68 3a 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  h:\n".          
32990 20 20 20 20 20 20 22 20 20 20 20 63 6f 73 74 3d        "    cost=
329a0 25 2e 31 66 2c 20 6e 52 6f 77 3d 25 2e 31 66 2c  %.1f, nRow=%.1f,
329b0 20 6e 4f 42 53 61 74 3d 25 64 2c 20 77 73 46 6c   nOBSat=%d, wsFl
329c0 61 67 73 3d 30 78 25 30 38 78 5c 6e 22 2c 0a 20  ags=0x%08x\n",. 
329d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
329e0 65 73 74 4a 2c 20 70 54 61 62 4c 69 73 74 2d 3e  estJ, pTabList->
329f0 61 5b 62 65 73 74 4a 5d 2e 70 54 61 62 2d 3e 7a  a[bestJ].pTab->z
32a00 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
32a10 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 70 57 49        pLevel-pWI
32a20 6e 66 6f 2d 3e 61 2c 20 62 65 73 74 50 6c 61 6e  nfo->a, bestPlan
32a30 2e 72 43 6f 73 74 2c 20 62 65 73 74 50 6c 61 6e  .rCost, bestPlan
32a40 2e 70 6c 61 6e 2e 6e 52 6f 77 2c 0a 20 20 20 20  .plan.nRow,.    
32a50 20 20 20 20 20 20 20 20 20 20 20 20 62 65 73 74              best
32a60 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  Plan.plan.nOBSat
32a70 2c 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  , bestPlan.plan.
32a80 77 73 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69  wsFlags));.    i
32a90 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61  f( (bestPlan.pla
32aa0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
32ab0 45 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29  E_DISTINCT)!=0 )
32ac0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
32ad0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
32ae0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57  t==0 );.      pW
32af0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
32b00 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
32b10 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a  _ORDERED;.    }.
32b20 20 20 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20      andFlags &= 
32b30 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
32b40 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
32b50 6c 2d 3e 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c  l->plan = bestPl
32b60 61 6e 2e 70 6c 61 6e 3b 0a 20 20 20 20 70 4c 65  an.plan;.    pLe
32b70 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
32b80 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
32b90 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 74  ].iCursor;.    t
32ba0 65 73 74 63 61 73 65 28 20 62 65 73 74 50 6c 61  estcase( bestPla
32bb0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
32bc0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
32bd0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
32be0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
32bf0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
32c00 4d 50 5f 49 4e 44 45 58 20 29 3b 0a 20 20 20 20  MP_INDEX );.    
32c10 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  if( bestPlan.pla
32c20 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
32c30 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45  RE_INDEXED|WHERE
32c40 5f 54 45 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a  _TEMP_INDEX) ){.
32c50 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
32c60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
32c70 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 0a 20 20  ETABLE_ONLY) .  
32c80 20 20 20 20 20 26 26 20 28 62 65 73 74 50 6c 61       && (bestPla
32c90 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
32ca0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
32cb0 58 29 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a  X)==0 .      ){.
32cc0 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
32cd0 69 49 64 78 43 75 72 20 3d 20 69 49 64 78 43 75  iIdxCur = iIdxCu
32ce0 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
32cf0 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
32d00 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
32d10 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
32d20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
32d30 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
32d40 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ur = -1;.    }. 
32d50 20 20 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64     sWBI.notValid
32d60 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61   &= ~getMask(pMa
32d70 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
32d80 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f  >a[bestJ].iCurso
32d90 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  r);.    pLevel->
32da0 69 46 72 6f 6d 20 3d 20 28 75 38 29 62 65 73 74  iFrom = (u8)best
32db0 4a 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74 50  J;.    if( bestP
32dc0 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28  lan.plan.nRow>=(
32dd0 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20 20 20  double)1 ){.    
32de0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
32df0 4c 6f 6f 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e  Loop *= bestPlan
32e00 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20  .plan.nRow;.    
32e10 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
32e20 74 68 61 74 20 69 66 20 74 68 65 20 74 61 62 6c  that if the tabl
32e30 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 69  e scanned by thi
32e40 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e  s loop iteration
32e50 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49   had an.    ** I
32e60 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
32e70 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74 2c   attached to it,
32e80 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65 64 20   that the named 
32e90 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67 0a 20  index is being. 
32ea0 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74     ** used for t
32eb0 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c  he scan. If not,
32ec0 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f 6d 70   then query comp
32ed0 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61 69 6c  ilation has fail
32ee0 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75 72  ed..    ** Retur
32ef0 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
32f00 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70 54  */.    pIdx = pT
32f10 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
32f20 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
32f30 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69   pIdx ){.      i
32f40 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61  f( (bestPlan.pla
32f50 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
32f60 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b  E_INDEXED)==0 ){
32f70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32f80 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
32f90 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64   "cannot use ind
32fa0 65 78 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a  ex: %s", pIdx->z
32fb0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
32fc0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
32fd0 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ror;.      }else
32fe0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
32ff0 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
33000 61 75 73 65 20 69 73 20 75 73 65 64 2c 20 74 68  ause is used, th
33010 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 66 75  e bestIndex() fu
33020 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  nction is.      
33030 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
33040 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 64 65  to find the inde
33050 78 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  x specified in t
33060 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
33070 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
33080 69 66 20 69 74 20 66 69 6e 64 20 61 6e 20 69 6e  if it find an in
33090 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20  dex at all. */. 
330a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62         assert( b
330b0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70  estPlan.plan.u.p
330c0 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20  Idx==pIdx );.   
330d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
330e0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
330f0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
33100 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
33110 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
33120 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
33130 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
33140 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
33150 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 61  r;.  }.  if( nTa
33160 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 70 4c 65  bList ){.    pLe
33170 76 65 6c 2d 2d 3b 0a 20 20 20 20 70 57 49 6e 66  vel--;.    pWInf
33180 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4c 65 76  o->nOBSat = pLev
33190 65 6c 2d 3e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b  el->plan.nOBSat;
331a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
331b0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30  Info->nOBSat = 0
331c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
331d0 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f  he total query o
331e0 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73 69  nly selects a si
331f0 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74  ngle row, then t
33200 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
33210 20 63 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c   clause is irrel
33220 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  evant..  */.  if
33230 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48  ( (andFlags & WH
33240 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26  ERE_UNIQUE)!=0 &
33250 26 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  & pOrderBy ){.  
33260 20 20 61 73 73 65 72 74 28 20 6e 54 61 62 4c 69    assert( nTabLi
33270 73 74 3d 3d 30 20 7c 7c 20 28 70 4c 65 76 65 6c  st==0 || (pLevel
33280 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
33290 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55   WHERE_ALL_UNIQU
332a0 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 57 49  E)!=0 );.    pWI
332b0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f  nfo->nOBSat = pO
332c0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
332d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
332e0 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44  caller is an UPD
332f0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
33300 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
33310 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
33320 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  to use a one-pas
33330 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74  s algorithm, det
33340 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69  ermine if this i
33350 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
33360 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73   ** The one-pass
33370 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20   algorithm only 
33380 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48 45  works if the WHE
33390 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
333a0 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20 73  aints.  ** the s
333b0 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61  tatement to upda
333c0 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e  te a single row.
333d0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
333e0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
333f0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
33400 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
33410 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
33420 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
33430 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
33440 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 26 26  S_DESIRED)!=0 &&
33450 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45   (andFlags & WHE
33460 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b  RE_UNIQUE)!=0 ){
33470 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  .    pWInfo->okO
33480 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20  nePass = 1;.    
33490 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61  pWInfo->a[0].pla
334a0 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  n.wsFlags &= ~WH
334b0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
334c0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
334d0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
334e0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
334f0 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
33500 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
33510 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
33520 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
33530 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
33540 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a  (pParse, -1); /*
33550 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b   Insert the cook
33560 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f  ie verifier Goto
33570 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
33580 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
33590 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
335a0 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 66  = (double)1;.  f
335b0 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  or(ii=0, pLevel=
335c0 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54  pWInfo->a; ii<nT
335d0 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c  abList; ii++, pL
335e0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
335f0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
33600 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
33610 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
33620 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
33630 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
33640 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
33650 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ex */.    struct
33660 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
33670 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54  TabItem;..    pT
33680 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
33690 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
336a0 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
336b0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
336c0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
336d0 77 4f 75 74 20 2a 3d 20 70 4c 65 76 65 6c 2d 3e  wOut *= pLevel->
336e0 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 69  plan.nRow;.    i
336f0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
33700 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
33710 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
33720 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
33730 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
33740 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
33750 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
33760 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
33770 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69   */.    }else.#i
33780 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33790 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
337a0 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
337b0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
337c0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
337d0 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  E)!=0 ){.      c
337e0 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62  onst char *pVTab
337f0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
33800 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c  )sqlite3GetVTabl
33810 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
33820 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54     int iCur = pT
33830 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
33840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
33850 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
33860 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30  Open, iCur, 0, 0
33870 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42  , pVTab, P4_VTAB
33880 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
33890 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
338a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f   ){.      /* noo
338b0 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  p */.    }else.#
338c0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
338d0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
338e0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
338f0 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
33900 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
33910 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
33920 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a  EN_CLOSE)==0 ){.
33930 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70        int op = p
33940 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
33950 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20   ? OP_OpenWrite 
33960 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  : OP_OpenRead;. 
33970 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
33980 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
33990 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
339a0 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b   iDb, pTab, op);
339b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
339c0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
339d0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
339e0 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  case( pTab->nCol
339f0 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
33a00 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
33a10 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
33a20 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20  Col<BMS ){.     
33a30 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
33a40 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
33a50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
33a60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
33a70 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
33a80 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
33a90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
33aa0 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
33ab0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
33ac0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
33ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
33ae0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
33af0 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
33b00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
33b10 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
33b20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
33b30 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
33b40 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
33b50 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
33b60 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
33b70 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  e);.    }.#ifnde
33b80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
33b90 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
33ba0 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
33bb0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
33bc0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21  ERE_TEMP_INDEX)!
33bd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
33be0 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
33bf0 64 65 78 28 70 50 61 72 73 65 2c 20 73 57 42 49  dex(pParse, sWBI
33c00 2e 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20  .pWC, pTabItem, 
33c10 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
33c20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
33c30 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
33c40 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
33c50 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
33c60 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49  D)!=0 ){.      I
33c70 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76  ndex *pIx = pLev
33c80 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
33c90 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
33ca0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
33cb0 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
33cc0 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69  e, pIx);.      i
33cd0 6e 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70  nt iIndexCur = p
33ce0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
33cf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
33d00 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
33d10 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
33d20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65     assert( iInde
33d30 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
33d40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33d50 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
33d60 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  d, iIndexCur, pI
33d70 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
33d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d90 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
33da0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
33db0 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64  NDOFF);.      Vd
33dc0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
33dd0 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29  s", pIx->zName))
33de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
33df0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
33e00 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
33e10 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26  ;.    notReady &
33e20 3d 20 7e 67 65 74 4d 61 73 6b 28 73 57 42 49 2e  = ~getMask(sWBI.
33e30 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70  pWC->pMaskSet, p
33e40 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
33e50 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  );.  }.  pWInfo-
33e60 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  >iTop = sqlite3V
33e70 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
33e80 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
33e90 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
33ea0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
33eb0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
33ec0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
33ed0 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
33ee0 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
33ef0 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
33f00 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
33f10 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
33f20 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
33f30 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
33f40 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
33f50 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
33f60 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  sk)0;.  for(ii=0
33f70 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
33f80 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i++){.    pLevel
33f90 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
33fa0 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e  ];.    explainOn
33fb0 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54  eScan(pParse, pT
33fc0 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
33fd0 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ii, pLevel->iFro
33fe0 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  m, wctrlFlags);.
33ff0 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63      notReady = c
34000 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
34010 70 57 49 6e 66 6f 2c 20 69 69 2c 20 77 63 74 72  pWInfo, ii, wctr
34020 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79  lFlags, notReady
34030 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69  );.    pWInfo->i
34040 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65  Continue = pLeve
34050 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d  l->addrCont;.  }
34060 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
34070 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73  TEST  /* For tes
34080 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
34090 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20  ng use only */. 
340a0 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68   /* Record in th
340b0 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66  e query plan inf
340c0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
340d0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
340e0 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e  .  ** and the in
340f0 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65  dex used to acce
34100 73 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20  ss it (if any). 
34110 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74   If the table it
34120 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  self.  ** is not
34130 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20   used, its name 
34140 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49  is just '{}'.  I
34150 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73  f no index is us
34160 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  ed.  ** the inde
34170 78 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22  x is listed as "
34180 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69  {}".  If the pri
34190 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64  mary key is used
341a0 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
341b0 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a  name is '*'..  *
341c0 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
341d0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29  <nTabList; ii++)
341e0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
341f0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 6e     int n;.    in
34200 74 20 77 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t w;.    struct 
34210 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
34220 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 4c 65  abItem;..    pLe
34230 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
34240 5b 69 69 5d 3b 0a 20 20 20 20 77 20 3d 20 70 4c  [ii];.    w = pL
34250 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
34260 67 73 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d  gs;.    pTabItem
34270 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
34280 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
34290 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d      z = pTabItem
342a0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66  ->zAlias;.    if
342b0 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61  ( z==0 ) z = pTa
342c0 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
342d0 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69  me;.    n = sqli
342e0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
342f0 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e      if( n+nQPlan
34300 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   < sizeof(sqlite
34310 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30  3_query_plan)-10
34320 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 77   ){.      if( (w
34330 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
34340 59 29 21 3d 30 20 26 26 20 28 77 20 26 20 57 48  Y)!=0 && (w & WH
34350 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 29 3d  ERE_COVER_SCAN)=
34360 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =0 ){.        me
34370 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
34380 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
34390 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20  , "{}", 2);.    
343a0 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b      nQPlan += 2;
343b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
343c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
343d0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
343e0 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b  [nQPlan], z, n);
343f0 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
34400 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += n;.      }.  
34410 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72      sqlite3_quer
34420 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d  y_plan[nQPlan++]
34430 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20   = ' ';.    }.  
34440 20 20 74 65 73 74 63 61 73 65 28 20 77 20 26 20    testcase( w & 
34450 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
34460 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
34470 77 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  w & WHERE_ROWID_
34480 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69 66 28  RANGE );.    if(
34490 20 77 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49   w & (WHERE_ROWI
344a0 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
344b0 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
344c0 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
344d0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
344e0 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20  an], "* ", 2);. 
344f0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
34500 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
34510 28 77 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  (w & WHERE_INDEX
34520 45 44 29 21 3d 30 20 26 26 20 28 77 20 26 20 57  ED)!=0 && (w & W
34530 48 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 29  HERE_COVER_SCAN)
34540 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  ==0 ){.      n =
34550 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
34560 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e  (pLevel->plan.u.
34570 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
34580 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e      if( n+nQPlan
34590 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   < sizeof(sqlite
345a0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20  3_query_plan)-2 
345b0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
345c0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
345d0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70  _plan[nQPlan], p
345e0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
345f0 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  dx->zName, n);. 
34600 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
34610 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   n;.        sqli
34620 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
34630 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a  QPlan++] = ' ';.
34640 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34650 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  e{.      memcpy(
34660 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
34670 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
34680 20 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51   ", 3);.      nQ
34690 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d  Plan += 3;.    }
346a0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51  .  }.  while( nQ
346b0 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65  Plan>0 && sqlite
346c0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
346d0 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20  lan-1]==' ' ){. 
346e0 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
346f0 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20  _plan[--nQPlan] 
34700 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
34710 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
34720 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50  Plan] = 0;.  nQP
34730 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20  lan = 0;.#endif 
34740 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f  /* SQLITE_TEST /
34750 2f 20 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65  / Testing and de
34760 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
34770 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64   */..  /* Record
34780 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
34790 6e 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65  n address in the
347a0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
347b0 74 75 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a  ture.  Then.  **
347c0 20 63 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65   clean up and re
347d0 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  turn..  */.  ret
347e0 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
347f0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
34800 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
34810 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a  hereBeginError:.
34820 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a    if( pWInfo ){.
34830 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
34840 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
34850 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
34860 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46  ;.    whereInfoF
34870 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
34880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
34890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
348a0 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
348b0 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53  e WHERE loop.  S
348c0 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a  ee comments on .
348d0 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
348e0 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74  egin() for addit
348f0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
34900 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
34910 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65  e3WhereEnd(Where
34920 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
34930 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
34940 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
34950 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
34960 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
34970 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65  t i;.  WhereLeve
34980 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63  l *pLevel;.  Src
34990 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
349a0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
349b0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
349c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
349d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
349e0 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
349f0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ode..  */.  sqli
34a00 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
34a10 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
34a20 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
34a30 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
34a40 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
34a50 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
34a60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
34a70 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
34a80 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20  el->addrCont);. 
34a90 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
34aa0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
34ab0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34ac0 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d  ddOp2(v, pLevel-
34ad0 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  >op, pLevel->p1,
34ae0 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20   pLevel->p2);.  
34af0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
34b00 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
34b10 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20  l->p5);.    }.  
34b20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
34b30 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
34b40 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c  RE_IN_ABLE && pL
34b50 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30  evel->u.in.nIn>0
34b60 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
34b70 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
34b80 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
34b90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
34ba0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
34bb0 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20  el->addrNxt);.  
34bc0 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
34bd0 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d  ->u.in.nIn, pIn=
34be0 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  &pLevel->u.in.aI
34bf0 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b  nLoop[j-1]; j>0;
34c00 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20   j--, pIn--){.  
34c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34c20 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
34c30 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a  ->addrInTop+1);.
34c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
34c50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
34c60 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
34c70 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
34c80 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
34c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
34ca0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
34cb0 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20  drInTop-1);.    
34cc0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
34cd0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
34ce0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
34cf0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
34d00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
34d10 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
34d20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
34d30 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
34d40 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  oin ){.      int
34d50 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64   addr;.      add
34d60 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
34d70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
34d80 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
34d90 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  Join);.      ass
34da0 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  ert( (pLevel->pl
34db0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
34dc0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
34dd0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
34de0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
34df0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
34e00 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  XED)!=0 );.     
34e10 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
34e20 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
34e30 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
34e40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34e50 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
34e60 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62  OP_NullRow, pTab
34e70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
34e80 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
34e90 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
34ea0 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20  IdxCur>=0 ){.   
34eb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34ec0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
34ed0 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
34ee0 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
34ef0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
34f00 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
34f10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34f20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
34f30 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
34f40 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
34f50 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
34f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
34f70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
34f80 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
34f90 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
34fa0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
34fb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
34fc0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
34fd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
34fe0 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
34ff0 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
35000 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
35010 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
35020 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
35030 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
35040 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
35050 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
35060 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
35070 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
35080 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20  hat were opened 
35090 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
350a0 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  egin..  */.  ass
350b0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
350c0 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f  vel==1 || pWInfo
350d0 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69  ->nLevel==pTabLi
350e0 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f  st->nSrc );.  fo
350f0 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
35100 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66  Info->a; i<pWInf
35110 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20  o->nLevel; i++, 
35120 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49  pLevel++){.    I
35130 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
35140 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
35150 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
35160 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
35170 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
35180 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
35190 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
351a0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
351b0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
351c0 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
351d0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
351e0 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61  )==0.     && pTa
351f0 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20  b->pSelect==0.  
35200 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
35210 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
35220 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
35230 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  E)==0.    ){.   
35240 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 65 76     int ws = pLev
35250 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
35260 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49  ;.      if( !pWI
35270 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
35280 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44  & (ws & WHERE_ID
35290 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
352a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
352b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
352c0 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  ose, pTabItem->i
352d0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
352e0 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26  .      if( (ws &
352f0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
35300 3d 30 20 26 26 20 28 77 73 20 26 20 57 48 45 52  =0 && (ws & WHER
35310 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30  E_TEMP_INDEX)==0
35320 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
35330 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
35340 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65   OP_Close, pLeve
35350 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
35360 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
35370 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20  /* If this scan 
35380 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d  uses an index, m
35390 61 6b 65 20 63 6f 64 65 20 73 75 62 73 74 69 74  ake code substit
353a0 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64  utions to read d
353b0 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ata.    ** from 
353c0 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65  the index in pre
353d0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74  ference to the t
353e0 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c  able. Sometimes,
353f0 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   this means.    
35400 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65  ** the table nee
35410 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
35420 66 72 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20  from. This is a 
35430 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
35440 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65  t,.    ** as the
35450 20 76 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74   vdbe level wait
35460 73 20 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c  s until the tabl
35470 65 20 69 73 20 72 65 61 64 20 62 65 66 6f 72 65  e is read before
35480 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
35490 20 73 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62   seeking the tab
354a0 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  le cursor to the
354b0 20 72 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f   record correspo
354c0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
354d0 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69  rent.    ** posi
354e0 74 69 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  tion in the inde
354f0 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  x..    ** .    *
35500 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
35510 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
35520 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
35530 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
35540 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
35550 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
35560 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
35570 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
35580 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
35590 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
355a0 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
355b0 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
355c0 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
355d0 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
355e0 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
355f0 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
35600 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
35610 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
35620 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
35630 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
35640 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
35650 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
35660 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
35670 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
35680 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dx;.    }else if
35690 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
356a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
356b0 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20  ULTI_OR ){.     
356c0 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
356d0 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d  u.pCovidx;.    }
356e0 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26  .    if( pIdx &&
356f0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
35700 65 64 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  ed){.      int k
35710 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20  , j, last;.     
35720 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20   VdbeOp *pOp;.. 
35730 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
35740 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
35750 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20  WInfo->iTop);.  
35760 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
35770 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
35780 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
35790 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20  k=pWInfo->iTop; 
357a0 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
357b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
357c0 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
357d0 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
357e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
357f0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
35800 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
35810 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
35820 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
35830 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
35840 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
35850 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
35860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35870 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
35880 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
35890 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
358a0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
358b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
358c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
358d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
358e0 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c   assert( (pLevel
358f0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
35900 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
35910 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
35920 20 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43     || j<pIdx->nC
35930 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
35940 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
35950 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
35960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
35970 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
35980 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
35990 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
359a0 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
359b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
359c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
359d0 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
359e0 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  */.  pParse->nQu
359f0 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
35a00 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
35a10 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  p;.  whereInfoFr
35a20 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
35a30 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.