/ Hex Artifact Content
Login

Artifact acc2ec5f6879721f332223da393777438ea5a606:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0570: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0580: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0590: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
05a0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
05b0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
05c0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
05d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05e0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05f0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0600: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0610: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0620: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
0630: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
0640: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
0650: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
0660: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
0670: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
0680: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0690: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06a0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06b0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06d0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06e0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06f0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0700: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0710: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0720: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0730: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0750: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0760: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0770: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0780: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0790: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07a0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07b0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07c0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
07d0: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
07e0: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
07f0: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0800: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0810: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0820: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0830: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0840: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0850: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0860: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0870: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0880: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0890: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08a0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08b0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
08c0: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
08d0: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08e0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0900: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0910: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0920: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0930: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0940: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0950: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
0960: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
0970: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
0980: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
0990: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09a0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09b0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
09c0: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
09d0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
09e0: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
09f0: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a10: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a20: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a30: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0a60: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0a80: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0a90: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0aa0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0ab0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0ac0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0ad0: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0ae0: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0af0: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b00: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b10: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b30: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b40: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b50: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0b60: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0b70: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0b80: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0ba0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bb0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0bc0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0bd0: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0be0: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c00: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c10: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c30: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c40: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c50: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0c60: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0c70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0c80: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0c90: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ca0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cb0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0cc0: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0cd0: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0ce0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0cf0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d00: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d10: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d20: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d30: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d50: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0d60: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0d70: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0d80: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0d90: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0da0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0db0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0dc0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0dd0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0de0: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0df0: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e00: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e10: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e20: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e40: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e50: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0e60: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0e70: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0e80: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0e90: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ea0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0eb0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0ec0: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0ed0: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0ee0: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0ef0: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f00: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f10: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f20: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f30: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f40: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f50: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0f80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0f90: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fa0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0fc0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
0fd0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
0fe0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
0ff0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1000: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1020: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1030: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1040: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1050: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
1060: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
1070: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1080: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
1090: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10a0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f  nformation if eO
10c0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a  perator==WO_OR *
10d0: 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e  /.    WhereAndIn
10e0: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a  fo *pAndInfo; /*
10f0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
1100: 6f 6e 20 69 66 20 65 4f 70 65 72 61 74 6f 72 3d  on if eOperator=
1110: 3d 57 4f 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75  =WO_AND */.  } u
1120: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
1130: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
1140: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
1150: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
1160: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
1170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
1180: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
1190: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
11a0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
11b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11c0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
11d0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
11e0: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
11f0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
1200: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
1210: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
1220: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
1230: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
1240: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
1250: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
1260: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
1270: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
1280: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
1290: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
12a0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
12b0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
12c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
12d0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
12e0: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
12f0: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
1300: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
1310: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
1320: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1330: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
1340: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
1350: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
1360: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
1370: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
1380: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
1390: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
13a0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
13b0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
13c0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
13d0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
13e0: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
13f0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
1400: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
1410: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
1420: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
1430: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
1440: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
1450: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
1460: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
1470: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
1480: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
1490: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
14a0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
14b0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
14c0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
14d0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
14e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14f0: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
1500: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
1510: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
1520: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
1530: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
1540: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
1550: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
1560: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
1570: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
1580: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1590: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
15a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
15b0: 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20  cture holds all 
15c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
15d0: 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  t a.** WHERE cla
15e0: 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69  use.  Mostly thi
15f0: 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72  s is a container
1600: 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   for one or more
1610: 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a   WhereTerms..**.
1620: 2a 2a 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ** Explanation o
1630: 66 20 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61  f pOuter:  For a
1640: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
1650: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
1660: 20 20 20 20 20 20 20 20 20 20 61 20 41 4e 44 20            a AND 
1670: 28 28 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64  ((b AND c) OR (d
1680: 20 41 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a   AND e)) AND f.*
1690: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73  *.** There are s
16a0: 65 70 61 72 61 74 65 20 57 68 65 72 65 43 6c 61  eparate WhereCla
16b0: 75 73 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  use objects for 
16c0: 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65  the whole clause
16d0: 20 61 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20   and for.** the 
16e0: 73 75 62 63 6c 61 75 73 65 73 20 22 28 62 20 41  subclauses "(b A
16f0: 4e 44 20 63 29 22 20 61 6e 64 20 22 28 64 20 41  ND c)" and "(d A
1700: 4e 44 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75  ND e)".  The pOu
1710: 74 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ter field of the
1720: 0a 2a 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70  .** subclauses p
1730: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65  oints to the Whe
1740: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
1750: 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c  for the whole cl
1760: 61 75 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ause..*/.struct 
1770: 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20  WhereClause {.  
1780: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1790: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
17b0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
17c0: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20   *pMaskSet;  /* 
17d0: 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c 65  Mapping of table
17e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
17f0: 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20  to bitmasks */. 
1800: 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b 20   Bitmask vmask; 
1810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
1820: 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67  mask identifying
1830: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1840: 75 72 73 6f 72 73 20 2a 2f 0a 20 20 57 68 65 72  ursors */.  Wher
1850: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1860: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1870: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1880: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1890: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
18a0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
18b0: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
18c0: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
18d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18e0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18f0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
1900: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1920: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1930: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1950: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1960: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1970: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1980: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1990: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
19a0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
19b0: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
19c0: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
19d0: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19e0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19f0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1a00: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1a10: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1a20: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1a30: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a40: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a50: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a70: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a80: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a90: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1aa0: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1ab0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1ac0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1ad0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ae0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1af0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1b00: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1b10: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1b20: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1b30: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b50: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b60: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b70: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b80: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1ba0: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1bb0: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1bc0: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1bd0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1be0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bf0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1c00: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1c10: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1c20: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1c30: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c40: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c50: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c60: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c70: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1ca0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1cb0: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1cc0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1cd0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ce0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cf0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1d00: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1d10: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1d20: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1d30: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d40: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d50: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d60: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d70: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d80: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d90: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1da0: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1db0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1dc0: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1dd0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1de0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1df0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1e00: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1e10: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1e20: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1e30: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e40: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e50: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e60: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e70: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e80: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e90: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1ea0: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1eb0: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1ec0: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1ed0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1ef0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1f00: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1f10: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1f20: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1f30: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f40: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f50: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f60: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f70: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f80: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f90: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1fa0: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1fb0: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1fc0: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1fd0: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fe0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1ff0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
2000: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2010: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
2020: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
2030: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2040: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2050: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2060: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2070: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2080: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2090: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
20a0: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
20b0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
20c0: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
20d0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20e0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20f0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
2100: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
2110: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
2120: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
2130: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2140: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2150: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2160: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2170: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2180: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21b0: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
21c0: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
21d0: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21f0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
2200: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
2210: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
2220: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
2230: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2240: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2250: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2260: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2270: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2280: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2290: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
22a0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
22b0: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
22c0: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
22d0: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22e0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22f0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2300: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
2310: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
2320: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
2330: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2340: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2350: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2360: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2370: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2380: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2390: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
23a0: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
23b0: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
23c0: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
23d0: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23e0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
2400: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
2410: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
2420: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
2430: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2440: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2450: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2460: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2470: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2480: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2490: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
24a0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
24b0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
24c0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
24d0: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24f0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
2500: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
2510: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2520: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
2530: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2540: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2550: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2560: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2570: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2580: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
2590: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
25a0: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
25b0: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
25c0: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
25d0: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
25e0: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
25f0: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
2600: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
2610: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
2620: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
2630: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2640: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
2650: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
2660: 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46  ** Value for wsF
2670: 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2680: 20 62 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64   bestIndex() and
2690: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68   stored in.** Wh
26a0: 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73  ereLevel.wsFlags
26b0: 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 64  .  These flags d
26c0: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73  etermine which s
26d0: 65 61 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67  earch.** strateg
26e0: 69 65 73 20 61 72 65 20 61 70 70 72 6f 70 72 69  ies are appropri
26f0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ate..**.** The l
2700: 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  east significant
2710: 20 31 32 20 62 69 74 73 20 69 73 20 72 65 73 65   12 bits is rese
2720: 72 76 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66  rved as a mask f
2730: 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62  or WO_ values ab
2740: 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72  ove..** The Wher
2750: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66  eLevel.wsFlags f
2760: 69 65 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20  ield is usually 
2770: 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f  set to WO_IN|WO_
2780: 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a  EQ|WO_ISNULL..**
2790: 20 42 75 74 20 69 66 20 74 68 65 20 74 61 62 6c   But if the tabl
27a0: 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
27b0: 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a  able of a left j
27c0: 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e  oin, WhereLevel.
27d0: 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65  wsFlags.** is se
27e0: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
27f0: 2e 20 20 54 68 65 20 57 68 65 72 65 4c 65 76 65  .  The WhereLeve
2800: 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20  l.wsFlags field 
2810: 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64  can then be used
2820: 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20   as.** the "op" 
2830: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e  parameter to fin
2840: 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72  dTerm when we ar
2850: 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61  e resolving equa
2860: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
2870: 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73  ..** ISNULL cons
2880: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65  traints will the
2890: 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e  n not be used on
28a0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
28b0: 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f   of a left.** jo
28c0: 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31  in.  Tickets #21
28d0: 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f  77 and #2189..*/
28e0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
28f0: 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78 30 30  OWID_EQ     0x00
2900: 30 30 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64  001000  /* rowid
2910: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
2920: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
2930: 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  ne WHERE_ROWID_R
2940: 41 4e 47 45 20 20 30 78 30 30 30 30 32 30 30 30  ANGE  0x00002000
2950: 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20    /* rowid<EXPR 
2960: 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50  and/or rowid>EXP
2970: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
2980: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20  RE_COLUMN_EQ    
2990: 30 78 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78  0x00010000  /* x
29a0: 3d 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e  =EXPR or x IN (.
29b0: 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c  ..) or x IS NULL
29c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
29d0: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30  E_COLUMN_RANGE 0
29e0: 78 30 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c  x00020000  /* x<
29f0: 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58  EXPR and/or x>EX
2a00: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
2a10: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20  ERE_COLUMN_IN   
2a20: 20 30 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20   0x00040000  /* 
2a30: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
2a40: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
2a50: 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30  MN_NULL  0x00080
2a60: 30 30 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c  000  /* x IS NUL
2a70: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  L */.#define WHE
2a80: 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20  RE_INDEXED      
2a90: 30 78 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41  0x000f0000  /* A
2aa0: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 75 73 65  nything that use
2ab0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64  s an index */.#d
2ac0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f  efine WHERE_NOT_
2ad0: 46 55 4c 4c 53 43 41 4e 20 30 78 31 30 30 66 33  FULLSCAN 0x100f3
2ae0: 30 30 30 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74  000  /* Does not
2af0: 20 64 6f 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   do a full table
2b00: 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65   scan */.#define
2b10: 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20   WHERE_IN_ABLE  
2b20: 20 20 20 20 30 78 30 30 30 66 31 30 30 30 20 20      0x000f1000  
2b30: 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75 70 70 6f  /* Able to suppo
2b40: 72 74 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  rt an IN operato
2b50: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  r */.#define WHE
2b60: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20  RE_TOP_LIMIT    
2b70: 30 78 30 30 31 30 30 30 30 30 20 20 2f 2a 20 78  0x00100000  /* x
2b80: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
2b90: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
2ba0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
2bb0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 32 30  _LIMIT    0x0020
2bc0: 30 30 30 30 20 20 2f 2a 20 78 3e 45 58 50 52 20  0000  /* x>EXPR 
2bd0: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
2be0: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
2bf0: 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49   WHERE_BOTH_LIMI
2c00: 54 20 20 20 30 78 30 30 33 30 30 30 30 30 20 20  T   0x00300000  
2c10: 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61  /* Both x>EXPR a
2c20: 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65  nd x<EXPR */.#de
2c30: 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f  fine WHERE_IDX_O
2c40: 4e 4c 59 20 20 20 20 20 30 78 30 30 34 30 30 30  NLY     0x004000
2c50: 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  00  /* Use index
2c60: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
2c70: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
2c80: 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20  ERE_ORDERBY     
2c90: 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a 20   0x00800000  /* 
2ca0: 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65  Output will appe
2cb0: 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72  ar in correct or
2cc0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
2cd0: 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20  HERE_REVERSE    
2ce0: 20 20 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a    0x01000000  /*
2cf0: 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   Scan in reverse
2d00: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2d10: 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20  e WHERE_UNIQUE  
2d20: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2d30: 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d   /* Selects no m
2d40: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
2d50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2d60: 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20 20 20 30  E_ALL_UNIQUE   0
2d70: 78 30 34 30 30 30 30 30 30 20 20 2f 2a 20 54 68  x04000000  /* Th
2d80: 69 73 20 61 6e 64 20 61 6c 6c 20 70 72 69 6f 72  is and all prior
2d90: 20 68 61 76 65 20 6f 6e 65 20 72 6f 77 20 2a 2f   have one row */
2da0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
2db0: 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 30 38  IRTUALTABLE 0x08
2dc0: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76  000000  /* Use v
2dd0: 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f  irtual-table pro
2de0: 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69  cessing */.#defi
2df0: 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  ne WHERE_MULTI_O
2e00: 52 20 20 20 20 20 30 78 31 30 30 30 30 30 30 30  R     0x10000000
2e10: 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75    /* OR using mu
2e20: 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a  ltiple indices *
2e30: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2e40: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78 32  TEMP_INDEX   0x2
2e50: 30 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 73  0000000  /* Uses
2e60: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2e70: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  dex */.#define W
2e80: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 20 20 20  HERE_DISTINCT   
2e90: 20 20 30 78 34 30 30 30 30 30 30 30 20 20 2f 2a    0x40000000  /*
2ea0: 20 43 6f 72 72 65 63 74 20 6f 72 64 65 72 20 66   Correct order f
2eb0: 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 23  or DISTINCT */.#
2ec0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 56  define WHERE_COV
2ed0: 45 52 5f 53 43 41 4e 20 20 20 30 78 38 30 30 30  ER_SCAN   0x8000
2ee0: 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c 20 73 63  0000  /* Full sc
2ef0: 61 6e 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67  an of a covering
2f00: 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   index */../*.**
2f10: 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63 6f 6e   This module con
2f20: 74 61 69 6e 73 20 6d 61 6e 79 20 73 65 70 61 72  tains many separ
2f30: 61 74 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ate subroutines 
2f40: 74 68 61 74 20 77 6f 72 6b 20 74 6f 67 65 74 68  that work togeth
2f50: 65 72 20 74 6f 0a 2a 2a 20 66 69 6e 64 20 74 68  er to.** find th
2f60: 65 20 62 65 73 74 20 69 6e 64 69 63 65 73 20 74  e best indices t
2f70: 6f 20 75 73 65 20 66 6f 72 20 61 63 63 65 73 73  o use for access
2f80: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
2f90: 20 74 61 62 6c 65 20 69 6e 20 61 20 71 75 65 72   table in a quer
2fa0: 79 2e 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  y..** An instanc
2fb0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2fc0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c  ng structure hol
2fd0: 64 73 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ds context infor
2fe0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
2ff0: 0a 2a 2a 20 69 6e 64 65 78 20 73 65 61 72 63 68  .** index search
3000: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
3010: 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 70  be more easily p
3020: 61 73 73 65 64 20 62 65 74 77 65 65 6e 20 74 68  assed between th
3030: 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 72 6f 75  e various.** rou
3040: 74 69 6e 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  tines..*/.typede
3050: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 42 65  f struct WhereBe
3060: 73 74 49 64 78 20 57 68 65 72 65 42 65 73 74 49  stIdx WhereBestI
3070: 64 78 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65  dx;.struct Where
3080: 42 65 73 74 49 64 78 20 7b 0a 20 20 50 61 72 73  BestIdx {.  Pars
3090: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30b0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
30c0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
30d0: 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
30e0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
30f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
3100: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3110: 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
3120: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
3130: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
3140: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
3150: 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
3160: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
3170: 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
3180: 62 6c 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ble */.  Bitmask
3190: 20 6e 6f 74 56 61 6c 69 64 3b 20 20 20 20 20 20   notValid;      
31a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
31b0: 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
31c0: 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  e for any purpos
31d0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
31e0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
31f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
3200: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3210: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
3220: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
3230: 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74     /* The select
3240: 2d 6c 69 73 74 20 69 66 20 71 75 65 72 79 20 69  -list if query i
3250: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
3260: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
3270: 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 3b 20  fo **ppIdxInfo; 
3280: 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61  /* Index informa
3290: 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78  tion passed to x
32a0: 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 69  BestIndex */.  i
32b0: 6e 74 20 69 2c 20 6e 3b 20 20 20 20 20 20 20 20  nt i, n;        
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32d0: 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20 69 73 20  * Which loop is 
32e0: 62 65 69 6e 67 20 63 6f 64 65 64 3b 20 23 20 6f  being coded; # o
32f0: 66 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65  f loops */.  Whe
3300: 72 65 4c 65 76 65 6c 20 2a 61 4c 65 76 65 6c 3b  reLevel *aLevel;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3320: 49 6e 66 6f 20 61 62 6f 75 74 20 6f 75 74 65 72  Info about outer
3330: 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65 72   loops */.  Wher
3340: 65 43 6f 73 74 20 63 6f 73 74 3b 20 20 20 20 20  eCost cost;     
3350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3360: 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
3370: 20 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   plan */.};../*.
3380: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
3390: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  preallocated Whe
33a0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
33b0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
33c0: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  id whereClauseIn
33d0: 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  it(.  WhereClaus
33e0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f  e *pWC,        /
33f0: 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73  * The WhereClaus
3400: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
3410: 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  zed */.  Parse *
3420: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3430: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
3440: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
3450: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
3460: 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e  kSet,  /* Mappin
3470: 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75 72  g from table cur
3480: 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62  sor numbers to b
3490: 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 75 31 36  itmasks */.  u16
34a0: 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
34b0: 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 69        /* Might i
34c0: 6e 63 6c 75 64 65 20 57 48 45 52 45 5f 41 4e 44  nclude WHERE_AND
34d0: 5f 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 70 57  _ONLY */.){.  pW
34e0: 43 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  C->pParse = pPar
34f0: 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b  se;.  pWC->pMask
3500: 53 65 74 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a  Set = pMaskSet;.
3510: 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20    pWC->pOuter = 
3520: 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  0;.  pWC->nTerm 
3530: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
3540: 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57  t = ArraySize(pW
3550: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
3560: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
3570: 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e 76 6d 61  atic;.  pWC->vma
3580: 73 6b 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 77  sk = 0;.  pWC->w
3590: 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
35a0: 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f  lFlags;.}../* Fo
35b0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
35c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
35d0: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
35e0: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
35f0: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
3600: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
3610: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
3620: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
3630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3640: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
3650: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
3660: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
3670: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
3680: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
3690: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
36a0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
36b0: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
36c0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
36d0: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
36e0: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
36f0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
3700: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
3710: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
3720: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
3730: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
3740: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
3750: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
3760: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
3770: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
3780: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
3790: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
37a0: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
37b0: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
37c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
37d0: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
37e0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
37f0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
3800: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
3810: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
3820: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
3830: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
3840: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
3850: 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  WC->pParse->db;.
3860: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
3870: 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20  rm-1, a=pWC->a; 
3880: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b  i>=0; i--, a++){
3890: 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c  .    if( a->wtFl
38a0: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
38b0: 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IC ){.      sqli
38c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
38d0: 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  , a->pExpr);.   
38e0: 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74   }.    if( a->wt
38f0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
3900: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
3910: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64  reOrInfoDelete(d
3920: 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29  b, a->u.pOrInfo)
3930: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3940: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
3950: 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20  M_ANDINFO ){.   
3960: 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44     whereAndInfoD
3970: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
3980: 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  AndInfo);.    }.
3990: 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61    }.  if( pWC->a
39a0: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
39b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
39c0: 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b  ree(db, pWC->a);
39d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
39e0: 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57  d a single new W
39f0: 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74  hereTerm entry t
3a00: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  o the WhereClaus
3a10: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
3a20: 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   The new WhereTe
3a30: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  rm object is con
3a40: 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78  structed from Ex
3a50: 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74  pr p and with wt
3a60: 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e  Flags..** The in
3a70: 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20  dex in pWC->a[] 
3a80: 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65  of the new Where
3a90: 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64  Term is returned
3aa0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20   on success..** 
3ab0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  0 is returned if
3ac0: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
3ad0: 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  rm could not be 
3ae0: 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d  added due to a m
3af0: 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
3b00: 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20  ion error.  The 
3b10: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3b20: 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62  n failure will b
3b30: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a  e recorded in.**
3b40: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
3b50: 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68  ailed flag so th
3b60: 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  at higher-level 
3b70: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65  functions can de
3b80: 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  tect it..**.** T
3b90: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
3ba0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
3bb0: 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61  ze of the pWC->a
3bc0: 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
3bd0: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
3be0: 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75  the wtFlags argu
3bf0: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45  ment includes TE
3c00: 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  RM_DYNAMIC, then
3c10: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
3c20: 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  ** for freeing t
3c30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
3c40: 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68  is assumed by th
3c50: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
3c60: 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69  ject pWC..** Thi
3c70: 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69  s is true even i
3c80: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
3c90: 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ails to allocate
3ca0: 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d   a new WhereTerm
3cb0: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
3cc0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
3cd0: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
3ce0: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
3cf0: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
3d00: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
3d10: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
3d20: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
3d30: 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a  alidated after.*
3d40: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * calling this r
3d50: 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f  outine.  Such po
3d60: 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65  inters may be re
3d70: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72  initialized by r
3d80: 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68  eferencing.** th
3d90: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
3da0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3db0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
3dc0: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
3dd0: 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20  WC, Expr *p, u8 
3de0: 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72  wtFlags){.  Wher
3df0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
3e00: 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74 63  int idx;.  testc
3e10: 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20 54  ase( wtFlags & T
3e20: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20  ERM_VIRTUAL );  
3e30: 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31  /* EV: R-00211-1
3e40: 35 31 30 30 20 2a 2f 0a 20 20 69 66 28 20 70 57  5100 */.  if( pW
3e50: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
3e60: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
3e70: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
3e80: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
3e90: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61  3 *db = pWC->pPa
3ea0: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43  rse->db;.    pWC
3eb0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
3ec0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
3ed0: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
3ee0: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
3ef0: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
3f00: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74   ){.      if( wt
3f10: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  Flags & TERM_DYN
3f20: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20  AMIC ){.        
3f30: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3f40: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
3f50: 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d  }.      pWC->a =
3f60: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74   pOld;.      ret
3f70: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
3f80: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
3f90: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
3fa0: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
3fb0: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
3fc0: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
3fd0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3fe0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29  DbFree(db, pOld)
3ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d  ;.    }.    pWC-
4000: 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33  >nSlot = sqlite3
4010: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
4020: 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28   pWC->a)/sizeof(
4030: 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a  pWC->a[0]);.  }.
4040: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
4050: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
4060: 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e  rm++];.  pTerm->
4070: 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65  pExpr = p;.  pTe
4080: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74  rm->wtFlags = wt
4090: 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e  Flags;.  pTerm->
40a0: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65  pWC = pWC;.  pTe
40b0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
40c0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a  ;.  return idx;.
40d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
40e0: 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73  utine identifies
40f0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
4100: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
4110: 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  use where.** eac
4120: 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
4130: 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
4140: 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  the AND operator
4150: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   or some other.*
4160: 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69  * operator speci
4170: 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70  fied in the op p
4180: 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57  arameter.  The W
4190: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
41a0: 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65  ture.** is fille
41b0: 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  d with pointers 
41c0: 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  to subexpression
41d0: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
41e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20  .**.**    WHERE 
41f0: 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20   a=='hello' AND 
4200: 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31  coalesce(b,11)<1
4210: 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f  0 AND (c+12!=d O
4220: 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20  R c==22).**     
4230: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f        \________/
4240: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
4250: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
4260: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
4270: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
4280: 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73  [0]            s
4290: 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20  lot[1]          
42a0: 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a       slot[2].**.
42b0: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
42c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
42d0: 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72  pExpr is unalter
42e0: 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ed.  All this ro
42f0: 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73  utine.** does is
4300: 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74   make slot[] ent
4310: 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75  ries point to su
4320: 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69  bstructure withi
4330: 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49  n pExpr..**.** I
4340: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
4350: 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74  entence and in t
4360: 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f  he diagram, "slo
4370: 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a  t[]" refers to.*
4380: 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  * the WhereClaus
4390: 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68  e.a[] array.  Th
43a0: 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67  e slot[] array g
43b0: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
43c0: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
43d0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
43e0: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
43f0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
4400: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
4410: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
4420: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
4430: 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  pWC->op = (u8)op
4440: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
4450: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
4460: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
4470: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
4480: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
4490: 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pr, 0);.  }else{
44a0: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
44b0: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  pWC, pExpr->pLef
44c0: 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72  t, op);.    wher
44d0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
44e0: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  r->pRight, op);.
44f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
4500: 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65  tialize an expre
4510: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28  ssion mask set (
4520: 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f  a WhereMaskSet o
4530: 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e  bject).*/.#defin
4540: 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29  e initMaskSet(P)
4550: 20 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20 73    memset(P, 0, s
4560: 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a  izeof(*P))../*.*
4570: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
4580: 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76  mask for the giv
4590: 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  en cursor number
45a0: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a  .  Return 0 if.*
45b0: 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74  * iCursor is not
45c0: 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a   in the set..*/.
45d0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67  static Bitmask g
45e0: 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  etMask(WhereMask
45f0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
4600: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69  nt iCursor){.  i
4610: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
4620: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e  pMaskSet->n<=(in
4630: 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  t)sizeof(Bitmask
4640: 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  )*8 );.  for(i=0
4650: 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b  ; i<pMaskSet->n;
4660: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
4670: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d  MaskSet->ix[i]==
4680: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
4690: 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61 73   return ((Bitmas
46a0: 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20  k)1)<<i;.    }. 
46b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
46c0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
46d0: 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75   new mask for cu
46e0: 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a  rsor iCursor..**
46f0: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  .** There is one
4700: 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c   cursor per tabl
4710: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
4720: 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65  ause.  The numbe
4730: 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69  r of.** tables i
4740: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
4750: 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
4760: 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20  a test early in 
4770: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  the.** sqlite3Wh
4780: 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69  ereBegin() routi
4790: 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20  ne.  So we know 
47a0: 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65  that the pMaskSe
47b0: 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79  t->ix[].** array
47c0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72   will never over
47d0: 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  flow..*/.static 
47e0: 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28  void createMask(
47f0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
4800: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
4810: 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  sor){.  assert( 
4820: 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72  pMaskSet->n < Ar
4830: 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74  raySize(pMaskSet
4840: 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b  ->ix) );.  pMask
4850: 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74  Set->ix[pMaskSet
4860: 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72  ->n++] = iCursor
4870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4880: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72  routine walks (r
4890: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
48a0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
48b0: 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20  nd generates.** 
48c0: 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  a bitmask indica
48d0: 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65  ting which table
48e0: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
48f0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  at expression.**
4900: 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   tree..**.** In 
4910: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72  order for this r
4920: 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20  outine to work, 
4930: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
4940: 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a  tion must have.*
4950: 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76  * previously inv
4960: 6f 6b 65 64 20 73 71 6c 69 74 65 33 52 65 73 6f  oked sqlite3Reso
4970: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 6f  lveExprNames() o
4980: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
4990: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65  .  See.** the he
49a0: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
49b0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
49c0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
49d0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  rmation..** The 
49e0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
49f0: 70 72 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e  prNames() routin
4a00: 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c  es looks for col
4a10: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a  umn names and.**
4a20: 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f   sets their opco
4a30: 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  des to TK_COLUMN
4a40: 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e   and their Expr.
4a50: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f  iTable fields to
4a60: 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72  .** the VDBE cur
4a70: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
4a80: 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  e table.  This r
4a90: 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20  outine just has 
4aa0: 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20  to.** translate 
4ab0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
4ac0: 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20  rs into bitmask 
4ad0: 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c  values and OR al
4ae0: 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b  l.** the bitmask
4af0: 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73  s together..*/.s
4b00: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4b10: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
4b20: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20  (WhereMaskSet*, 
4b30: 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
4b40: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
4b50: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
4b60: 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53  WhereMaskSet*, S
4b70: 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20  elect*);.static 
4b80: 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c  Bitmask exprTabl
4b90: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
4ba0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
4bb0: 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61  xpr *p){.  Bitma
4bc0: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
4bd0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4be0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d   0;.  if( p->op=
4bf0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
4c00: 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b    mask = getMask
4c10: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54  (pMaskSet, p->iT
4c20: 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72  able);.    retur
4c30: 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61  n mask;.  }.  ma
4c40: 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  sk = exprTableUs
4c50: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
4c60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b  >pRight);.  mask
4c70: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
4c80: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
4c90: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 45 78  pLeft);.  if( Ex
4ca0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4cb0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
4cc0: 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  {.    mask |= ex
4cd0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4ce0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
4cf0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65  x.pSelect);.  }e
4d00: 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  lse{.    mask |=
4d10: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4d20: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
4d30: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  >x.pList);.  }. 
4d40: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
4d50: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
4d60: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4d70: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
4d80: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69  pMaskSet, ExprLi
4d90: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
4da0: 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  t i;.  Bitmask m
4db0: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
4dc0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
4dd0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
4de0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
4df0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
4e00: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4e10: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
4e20: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
4e30: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
4e40: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4e50: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
4e60: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4e70: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c  t *pMaskSet, Sel
4e80: 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d  ect *pS){.  Bitm
4e90: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
4ea0: 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20  while( pS ){.   
4eb0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
4ec0: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d   pS->pSrc;.    m
4ed0: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
4ee0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4ef0: 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b  et, pS->pEList);
4f00: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
4f10: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
4f20: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47  pMaskSet, pS->pG
4f30: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73  roupBy);.    mas
4f40: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
4f50: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4f60: 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b  , pS->pOrderBy);
4f70: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
4f80: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
4f90: 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65  kSet, pS->pWhere
4fa0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
4fb0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4fc0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76  askSet, pS->pHav
4fd0: 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 41 4c  ing);.    if( AL
4fe0: 57 41 59 53 28 70 53 72 63 21 3d 30 29 20 29 7b  WAYS(pSrc!=0) ){
4ff0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
5000: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5010: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
5020: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  .        mask |=
5030: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
5040: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
5050: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
5060: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  ct);.        mas
5070: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
5080: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
5090: 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  rc->a[i].pOn);. 
50a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
50b0: 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72   pS = pS->pPrior
50c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
50d0: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ask;.}../*.** Re
50e0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
50f0: 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20   given operator 
5100: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  is one of the op
5110: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a  erators that is.
5120: 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61  ** allowed for a
5130: 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52  n indexable WHER
5140: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20  E clause term.  
5150: 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72  The allowed oper
5160: 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22  ators are.** "="
5170: 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22  , "<", ">", "<="
5180: 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22  , ">=", and "IN"
5190: 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e  ..**.** IMPLEMEN
51a0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39  TATION-OF: R-599
51b0: 32 36 2d 32 36 33 39 33 20 54 6f 20 62 65 20 75  26-26393 To be u
51c0: 73 61 62 6c 65 20 62 79 20 61 6e 20 69 6e 64 65  sable by an inde
51d0: 78 20 61 20 74 65 72 6d 20 6d 75 73 74 20 62 65  x a term must be
51e0: 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68  .** of one of th
51f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
5200: 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72  s: column = expr
5210: 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20  ession column > 
5220: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f  expression.** co
5230: 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65 73 73 69  lumn >= expressi
5240: 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65 78 70 72  on column < expr
5250: 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d  ession column <=
5260: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65   expression.** e
5270: 78 70 72 65 73 73 69 6f 6e 20 3d 20 63 6f 6c 75  xpression = colu
5280: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 20  mn expression > 
5290: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
52a0: 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65  n >= column.** e
52b0: 78 70 72 65 73 73 69 6f 6e 20 3c 20 63 6f 6c 75  xpression < colu
52c0: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 3d  mn expression <=
52d0: 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49   column column I
52e0: 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73 69 6f 6e  N.** (expression
52f0: 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e 20 49 4e  -list) column IN
5300: 20 28 73 75 62 71 75 65 72 79 29 20 63 6f 6c 75   (subquery) colu
5310: 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74  mn IS NULL.*/.st
5320: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64  atic int allowed
5330: 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73  Op(int op){.  as
5340: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
5350: 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45  Q && TK_GT<TK_GE
5360: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
5370: 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _LT>TK_EQ && TK_
5380: 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  LT<TK_GE );.  as
5390: 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45  sert( TK_LE>TK_E
53a0: 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45  Q && TK_LE<TK_GE
53b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
53c0: 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a  _GE==TK_EQ+4 );.
53d0: 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f    return op==TK_
53e0: 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51  IN || (op>=TK_EQ
53f0: 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c   && op<=TK_GE) |
5400: 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b  | op==TK_ISNULL;
5410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74  .}../*.** Swap t
5420: 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79  wo objects of ty
5430: 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66  pe TYPE..*/.#def
5440: 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c  ine SWAP(TYPE,A,
5450: 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d  B) {TYPE t=A; A=
5460: 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20  B; B=t;}../*.** 
5470: 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72  Commute a compar
5480: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
5490: 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
54a0: 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22  he form "X op Y"
54b0: 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65  .** are converte
54c0: 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e  d into "Y op X".
54d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6c 6c  .**.** If a coll
54e0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
54f0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
5500: 68 20 65 69 74 68 65 72 20 74 68 65 20 6c 65 66  h either the lef
5510: 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a 20 73 69  t or right.** si
5520: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
5530: 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73  ison, it remains
5540: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5550: 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20 61   the same side a
5560: 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d  fter.** the comm
5570: 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63  utation. So "Y c
5580: 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70  ollate NOCASE op
5590: 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20   X" becomes .** 
55a0: 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53  "X collate NOCAS
55b0: 45 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69 73  E op Y". This is
55c0: 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c   because any col
55d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
55e0: 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68  on.** the left h
55f0: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f  and side of a co
5600: 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64  mparison overrid
5610: 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  es any collation
5620: 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74   sequence .** at
5630: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72 69  tached to the ri
5640: 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d  ght. For the sam
5650: 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f  e reason the EP_
5660: 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a  ExpCollate flag.
5670: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74  ** is not commut
5680: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
5690: 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50  id exprCommute(P
56a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
56b0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31  pr *pExpr){.  u1
56c0: 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45  6 expRight = (pE
56d0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
56e0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
56f0: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
5700: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
5710: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  ft->flags & EP_E
5720: 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73  xpCollate);.  as
5730: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
5740: 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45  pExpr->op) && pE
5750: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29  xpr->op!=TK_IN )
5760: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ;.  pExpr->pRigh
5770: 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  t->pColl = sqlit
5780: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
5790: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
57a0: 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  ght);.  pExpr->p
57b0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Left->pColl = sq
57c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
57d0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
57e0: 70 4c 65 66 74 29 3b 0a 20 20 53 57 41 50 28 43  pLeft);.  SWAP(C
57f0: 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70  ollSeq*,pExpr->p
5800: 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78  Right->pColl,pEx
5810: 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  pr->pLeft->pColl
5820: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
5830: 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78  ht->flags = (pEx
5840: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
5850: 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61  s & ~EP_ExpColla
5860: 74 65 29 20 7c 20 65 78 70 4c 65 66 74 3b 0a 20  te) | expLeft;. 
5870: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66   pExpr->pLeft->f
5880: 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70  lags = (pExpr->p
5890: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45  Left->flags & ~E
58a0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20  P_ExpCollate) | 
58b0: 65 78 70 52 69 67 68 74 3b 0a 20 20 53 57 41 50  expRight;.  SWAP
58c0: 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52  (Expr*,pExpr->pR
58d0: 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66  ight,pExpr->pLef
58e0: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
58f0: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op>=TK_GT ){.  
5900: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
5910: 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20  =TK_GT+2 );.    
5920: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
5930: 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_LE+2 );.    as
5940: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
5950: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
5960: 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a   TK_GT<TK_LE );.
5970: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
5980: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20  r->op>=TK_GT && 
5990: 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45  pExpr->op<=TK_GE
59a0: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   );.    pExpr->o
59b0: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d  p = ((pExpr->op-
59c0: 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b  TK_GT)^2)+TK_GT;
59d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
59e0: 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f  anslate from TK_
59f0: 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57  xx operator to W
5a00: 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f  O_xx bitmask..*/
5a10: 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65 72  .static u16 oper
5a20: 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29  atorMask(int op)
5a30: 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73  {.  u16 c;.  ass
5a40: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f  ert( allowedOp(o
5a50: 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  p) );.  if( op==
5a60: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d  TK_IN ){.    c =
5a70: 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20   WO_IN;.  }else 
5a80: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
5a90: 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  L ){.    c = WO_
5aa0: 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  ISNULL;.  }else{
5ab0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57 4f  .    assert( (WO
5ac0: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
5ad0: 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20 20   < 0x7fff );.   
5ae0: 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45 51   c = (u16)(WO_EQ
5af0: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20  <<(op-TK_EQ));. 
5b00: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21   }.  assert( op!
5b10: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d  =TK_ISNULL || c=
5b20: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =WO_ISNULL );.  
5b30: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
5b40: 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b  N || c==WO_IN );
5b50: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
5b60: 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51  K_EQ || c==WO_EQ
5b70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5b80: 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LT || c==WO
5b90: 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LT );.  assert(
5ba0: 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d   op!=TK_LE || c=
5bb0: 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65  =WO_LE );.  asse
5bc0: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  rt( op!=TK_GT ||
5bd0: 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61   c==WO_GT );.  a
5be0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45  ssert( op!=TK_GE
5bf0: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a   || c==WO_GE );.
5c00: 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
5c10: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
5c20: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
5c30: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
5c40: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
5c50: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
5c60: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72  * where X is a r
5c70: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
5c80: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
5c90: 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69   iCur and <op> i
5ca0: 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20  s one of.** the 
5cb0: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
5cc0: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
5cd0: 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  y the op paramet
5ce0: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  er..** Return a 
5cf0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
5d00: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69  erm.  Return 0 i
5d10: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
5d20: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
5d30: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
5d40: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
5d50: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5d60: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
5d70: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
5d80: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
5d90: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
5da0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
5db0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
5dc0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
5dd0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
5de0: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
5df0: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
5e00: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
5e10: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
5e20: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
5e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
5e40: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
5e50: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
5e60: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
5e70: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
5e80: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
5e90: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
5ea0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
5eb0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
5ec0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
5ed0: 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65 72 74 28  int k;.  assert(
5ee0: 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20 20 6f 70   iCur>=0 );.  op
5ef0: 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20 20 66 6f   &= WO_ALL;.  fo
5f00: 72 28 3b 20 70 57 43 3b 20 70 57 43 3d 70 57 43  r(; pWC; pWC=pWC
5f10: 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 66  ->pOuter){.    f
5f20: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
5f30: 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k=pWC->nTerm; k
5f40: 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; k--, pTerm++){
5f50: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
5f60: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
5f70: 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ur.         && (
5f80: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
5f90: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  ht & notReady)==
5fa0: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 54  0.         && pT
5fb0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
5fc0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
5fd0: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
5fe0: 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21 3d  Operator & op)!=
5ff0: 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
6000: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
6010: 30 20 26 26 20 70 49 64 78 20 26 26 20 70 54 65  0 && pIdx && pTe
6020: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
6030: 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
6040: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
6050: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
6060: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
6070: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
6080: 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a     char idxaff;.
6090: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
60a0: 0a 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65  .          Parse
60b0: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
60c0: 70 50 61 72 73 65 3b 0a 20 20 0a 20 20 20 20 20  pParse;.  .     
60d0: 20 20 20 20 20 69 64 78 61 66 66 20 3d 20 70 49       idxaff = pI
60e0: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
60f0: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
6100: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ty;.          if
6110: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
6120: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64  ffinityOk(pX, id
6130: 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  xaff) ) continue
6140: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 2f  ;.  .          /
6150: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
6160: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
6170: 6e 63 65 20 72 65 71 75 69 72 65 64 20 66 72 6f  nce required fro
6180: 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20  m an index for. 
6190: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 74           ** it t
61a0: 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72 20  o be useful for 
61b0: 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70 72 65  optimising expre
61c0: 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65 20  ssion pX. Store 
61d0: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
61e0: 2a 20 76 61 6c 75 65 20 69 6e 20 76 61 72 69 61  * value in varia
61f0: 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20  ble pColl..     
6200: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
6210: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
6220: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ft);.          p
6230: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
6240: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
6250: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
6260: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
6270: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
6280: 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20 70 50 61  ert(pColl || pPa
6290: 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 20 20 0a 20  rse->nErr);.  . 
62a0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
62b0: 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ; pIdx->aiColumn
62c0: 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b  [j]!=iColumn; j+
62d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
62e0: 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64  if( NEVER(j>=pId
62f0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65  x->nColumn) ) re
6300: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
6310: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
6320: 28 20 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69 74  ( pColl && sqlit
6330: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
6340: 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
6350: 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69  Coll[j]) ) conti
6360: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
6370: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54         return pT
6380: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
6390: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
63a0: 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  0;.}../* Forward
63b0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
63c0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
63d0: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
63e0: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
63f0: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
6400: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
6410: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
6420: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a  ERE clause.  .**
6430: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
6440: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
6450: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
6460: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
6470: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
6480: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
6490: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
64a0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
64b0: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
64c0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
64d0: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
64e0: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
64f0: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
6500: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
6510: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
6520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6530: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
6540: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
6550: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
6560: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
6570: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
6580: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
6590: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
65a0: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
65b0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
65c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
65d0: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
65e0: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
65f0: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
6600: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
6610: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
6620: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
6630: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
6640: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
6650: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
6660: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
6670: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
6680: 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20  OrGlob(.  Parse 
6690: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
66a0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
66b0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
66c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
66d0: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
66e0: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
66f0: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
6700: 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e  Prefix,  /* Poin
6710: 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47  ter to TK_STRING
6720: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
6730: 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20   pattern prefix 
6740: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d  */.  int *pisCom
6750: 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69  plete, /* True i
6760: 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63  f the only wildc
6770: 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20  ard is % in the 
6780: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a  last character *
6790: 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65  /.  int *pnoCase
67a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
67b0: 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71   uppercase is eq
67c0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65  uivalent to lowe
67d0: 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  rcase */.){.  co
67e0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
67f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
6800: 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b  ng on RHS of LIK
6810: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
6820: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
6830: 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69  Left;      /* Ri
6840: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a  ght and left siz
6850: 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  e of LIKE operat
6860: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  or */.  ExprList
6870: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
6880: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70     /* List of op
6890: 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49  erands to the LI
68a0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
68b0: 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20   int c;         
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
68d0: 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ne character in 
68e0: 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  z[] */.  int cnt
68f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6900: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6910: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72   non-wildcard pr
6920: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20  efix characters 
6930: 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b  */.  char wc[3];
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72  /* Wildcard char
6960: 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  acters */.  sqli
6970: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6980: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
6990: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
69a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
69b0: 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pVal = 0;.  in
69c0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
69d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
69e0: 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a  de of pRight */.
69f0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
6a00: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
6a10: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65  , pExpr, pnoCase
6a20: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
6a30: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  urn 0;.  }.#ifde
6a40: 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a  f SQLITE_EBCDIC.
6a50: 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29    if( *pnoCase )
6a60: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
6a70: 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  f.  pList = pExp
6a80: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c  r->x.pList;.  pL
6a90: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
6aa0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
6ab0: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
6ac0: 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  UMN .   || sqlit
6ad0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
6ae0: 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46  Left)!=SQLITE_AF
6af0: 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73  F_TEXT .   || Is
6b00: 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70  Virtual(pLeft->p
6b10: 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  Tab).  ){.    /*
6b20: 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39   IMP: R-02065-49
6b30: 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  465 The left-han
6b40: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49  d side of the LI
6b50: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
6b60: 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  tor must.    ** 
6b70: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
6b80: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
6b90: 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e   with TEXT affin
6ba0: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ity. */.    retu
6bb0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
6bc0: 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  rt( pLeft->iColu
6bd0: 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42  mn!=(-1) ); /* B
6be0: 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72  ecause IPK never
6bf0: 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f   has AFF_TEXT */
6c00: 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69  ..  pRight = pLi
6c10: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
6c20: 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f    op = pRight->o
6c30: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
6c40: 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
6c50: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32  op = pRight->op2
6c60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
6c70: 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20  TK_VARIABLE ){. 
6c80: 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70     Vdbe *pReprep
6c90: 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52  are = pParse->pR
6ca0: 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e  eprepare;.    in
6cb0: 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d  t iCol = pRight-
6cc0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56  >iColumn;.    pV
6cd0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  al = sqlite3Vdbe
6ce0: 47 65 74 56 61 6c 75 65 28 70 52 65 70 72 65 70  GetValue(pReprep
6cf0: 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54  are, iCol, SQLIT
6d00: 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20  E_AFF_NONE);.   
6d10: 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c   if( pVal && sql
6d20: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
6d30: 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  pVal)==SQLITE_TE
6d40: 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  XT ){.      z = 
6d50: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
6d60: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
6d70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6d80: 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
6d90: 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
6da0: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65   iCol);.    asse
6db0: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
6dc0: 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70  TK_VARIABLE || p
6dd0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  Right->op==TK_RE
6de0: 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73  GISTER );.  }els
6df0: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52  e if( op==TK_STR
6e00: 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  ING ){.    z = p
6e10: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  Right->u.zToken;
6e20: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a  .  }.  if( z ){.
6e30: 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
6e40: 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74   while( (c=z[cnt
6e50: 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30  ])!=0 && c!=wc[0
6e60: 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26  ] && c!=wc[1] &&
6e70: 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20   c!=wc[2] ){.   
6e80: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
6e90: 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26      if( cnt!=0 &
6ea0: 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74  & 255!=(u8)z[cnt
6eb0: 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  -1] ){.      Exp
6ec0: 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20  r *pPrefix;.    
6ed0: 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d    *pisComplete =
6ee0: 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63   c==wc[0] && z[c
6ef0: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20  nt+1]==0;.      
6f00: 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65  pPrefix = sqlite
6f10: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52  3Expr(db, TK_STR
6f20: 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69  ING, z);.      i
6f30: 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72  f( pPrefix ) pPr
6f40: 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63  efix->u.zToken[c
6f50: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  nt] = 0;.      *
6f60: 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66  ppPrefix = pPref
6f70: 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ix;.      if( op
6f80: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
6f90: 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
6fa0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6fb0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6fc0: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
6fd0: 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  v, pRight->iColu
6fe0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
6ff0: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26   *pisComplete &&
7000: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
7010: 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[1] ){.        
7020: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20    /* If the rhs 
7030: 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72  of the LIKE expr
7040: 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69  ession is a vari
7050: 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75  able, and the cu
7060: 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  rrent.          
7070: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
7080: 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74  variable means t
7090: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
70a0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49  to invoke the LI
70b0: 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  KE.          ** 
70c0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e  function, then n
70d0: 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69  o OP_Variable wi
70e0: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
70f0: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
7100: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
7110: 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f  uses problems fo
7120: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  r the sqlite3_bi
7130: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
7140: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
7150: 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f   API. To workaro
7160: 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20  und them, add a 
7170: 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c  dummy OP_Variabl
7180: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20  e here..        
7190: 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
71a0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
71b0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
71c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
71d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
71e0: 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67  get(pParse, pRig
71f0: 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ht, r1);.       
7200: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7210: 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65  angeP3(v, sqlite
7220: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
7230: 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  (v)-1, 0);.     
7240: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
7250: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
7260: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
7270: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
7280: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30  lse{.      z = 0
7290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
72a0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
72b0: 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
72c0: 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  (z!=0);.}.#endif
72d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
72e0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
72f0: 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N */...#ifndef S
7300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7310: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68  ALTABLE./*.** Ch
7320: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
7330: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
7340: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
7350: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
7360: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
7370: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  r.**.** If it is
7380: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55   then return TRU
7390: 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  E.  If not, retu
73a0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
73b0: 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f  tic int isMatchO
73c0: 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20  fColumn(.  Expr 
73d0: 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54  *pExpr      /* T
73e0: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
73f0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ion */.){.  Expr
7400: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
7410: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
7420: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
7430: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7440: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
7450: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
7460: 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30  oken,"match")!=0
7470: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7480: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
7490: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
74a0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
74b0: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
74c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
74d0: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
74e0: 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c  pr->op != TK_COL
74f0: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
7500: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
7510: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
7520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7530: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
7540: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
7550: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
7560: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
7570: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
7580: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
7590: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
75a0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
75b0: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
75c0: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
75d0: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
75e0: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
75f0: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
7600: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
7610: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
7620: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
7630: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
7640: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
7650: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
7660: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
7670: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
7680: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
7690: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
76a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
76b0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f  OMIT_SUBQUERY)./
76c0: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74  *.** Analyze a t
76d0: 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74  erm that consist
76e0: 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s of two or more
76f0: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a   OR-connected.**
7700: 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69   subterms.  So i
7710: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  n:.**.**     ...
7720: 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e   WHERE  (a=5) AN
7730: 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52  D (b=7 OR c=9 OR
7740: 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33   d=13) AND (d=13
7750: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e                ^^
7770: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
7780: 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ^^.**.** This ro
7790: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
77a0: 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65  erms such as the
77b0: 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20   middle term in 
77c0: 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c  the above exampl
77d0: 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54  e..** A WhereOrT
77e0: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
77f0: 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63  mputed and attac
7800: 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20  hed to the term 
7810: 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69  under.** analysi
7820: 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  s, regardless of
7830: 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20   the outcome of 
7840: 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48  the analysis.  H
7850: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ence:.**.**     
7860: 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67  WhereTerm.wtFlag
7870: 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49  s   |=  TERM_ORI
7880: 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  NFO.**     Where
7890: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20  Term.u.pOrInfo  
78a0: 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  =  a dynamically
78b0: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
78c0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a  OrTerm object.**
78d0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69  .** The term bei
78e0: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74  ng analyzed must
78f0: 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72   have two or mor
7900: 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  e of OR-connecte
7910: 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41  d subterms..** A
7920: 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20   single subterm 
7930: 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f  might be a set o
7940: 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  f AND-connected 
7950: 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a  sub-subterms..**
7960: 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72   Examples of ter
7970: 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69  ms under analysi
7980: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29  s:.**.**     (A)
7990: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
79a0: 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74  R t1.x=t2.z OR t
79b0: 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74  1.y=15 OR t1.z=t
79c0: 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29  3.a+5.**     (B)
79d0: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
79e0: 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70  expr2=x OR x=exp
79f0: 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20  r3.**     (C)   
7a00: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28    t1.x=t2.y OR (
7a10: 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31  t1.x=t2.z AND t1
7a20: 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44  .y=15).**     (D
7a30: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
7a40: 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20   (y>11 AND y<22 
7a50: 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c  AND z LIKE '*hel
7a60: 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29  lo*').**     (E)
7a70: 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20       (p.a=1 AND 
7a80: 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29  q.b=2 AND r.c=3)
7a90: 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71   OR (p.x=4 AND q
7aa0: 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a  .y=5 AND r.z=6).
7ab0: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a  **.** CASE 1:.**
7ac0: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
7ad0: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
7ae0: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72  orm T.C=expr for
7af0: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c   some single col
7b00: 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69  umn of C.** a si
7b10: 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73  ngle table T (as
7b20: 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c   shown in exampl
7b30: 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20  e B above) then 
7b40: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
7b50: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61  tual.** term tha
7b60: 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65  t is an equivale
7b70: 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  nt IN expression
7b80: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
7b90: 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a  s, if the term.*
7ba0: 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  * being analyzed
7bb0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   is:.**.**      
7bc0: 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65  x = expr1  OR  e
7bd0: 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20  xpr2 = x  OR  x 
7be0: 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68  = expr3.**.** th
7bf0: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7c00: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b  virtual term lik
7c10: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
7c20: 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65     x IN (expr1,e
7c30: 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a  xpr2,expr3).**.*
7c40: 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20  * CASE 2:.**.** 
7c50: 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20  If all subterms 
7c60: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79  are indexable by
7c70: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
7c80: 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a  T, then set.**.*
7c90: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
7ca0: 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20  eOperator       
7cb0: 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a         =  WO_OR.
7cc0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
7cd0: 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .u.pOrInfo->inde
7ce0: 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63  xable  |=  the c
7cf0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
7d00: 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41   table T.**.** A
7d10: 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64   subterm is "ind
7d20: 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73  exable" if it is
7d30: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
7d40: 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  "T.C <op> <expr>
7d50: 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79  " where C is any
7d60: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
7d70: 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20   T and .** <op> 
7d80: 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22  is one of "=", "
7d90: 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22  <", "<=", ">", "
7da0: 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20  >=", "IS NULL", 
7db0: 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75  or "IN"..** A su
7dc0: 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e  bterm is also in
7dd0: 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73  dexable if it is
7de0: 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f   an AND of two o
7df0: 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62  r more.** subsub
7e00: 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f  terms at least o
7e10: 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69  ne of which is i
7e20: 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78  ndexable.  Index
7e30: 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62  able AND .** sub
7e40: 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72  terms have their
7e50: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
7e60: 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65  o WO_AND and the
7e70: 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64  y have.** u.pAnd
7e80: 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79  Info set to a dy
7e90: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
7ea0: 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d  ted WhereAndTerm
7eb0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46   object..**.** F
7ec0: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e  rom another poin
7ed0: 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65  t of view, "inde
7ee0: 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61  xable" means tha
7ef0: 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f  t the subterm co
7f00: 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  uld.** potential
7f10: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ly be used with 
7f20: 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61  an index if an a
7f30: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
7f40: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73   exists..** This
7f50: 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e   analysis does n
7f60: 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74  ot consider whet
7f70: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69  her or not the i
7f80: 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61  ndex exists; tha
7f90: 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e  t.** is somethin
7fa0: 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28  g the bestIndex(
7fb0: 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  ) routine will d
7fc0: 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20  etermine.  This 
7fd0: 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79  analysis.** only
7fe0: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
7ff0: 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f  r subterms appro
8000: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78  priate for index
8010: 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ing exist..**.**
8020: 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20   All examples A 
8030: 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20  through E above 
8040: 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65  all satisfy case
8050: 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65   2.  But if a te
8060: 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69  rm.** also stati
8070: 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75  sfies case 1 (su
8080: 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77  ch as B) we know
8090: 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69   that the optimi
80a0: 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61  zer will.** alwa
80b0: 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31  ys prefer case 1
80c0: 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  , so in that cas
80d0: 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61  e we pretend tha
80e0: 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a  t case 2 is not.
80f0: 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a  ** satisfied..**
8100: 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20  .** It might be 
8110: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75  the case that mu
8120: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72  ltiple tables ar
8130: 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f  e indexable.  Fo
8140: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45  r example,.** (E
8150: 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78  ) above is index
8160: 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50  able on tables P
8170: 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a  , Q, and R..**.*
8180: 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74  * Terms that sat
8190: 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20  isfy case 2 are 
81a0: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c  candidates for l
81b0: 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a  ookup by using.*
81c0: 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  * separate indic
81d0: 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64  es to find rowid
81e0: 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65  s for each subte
81f0: 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67  rm and composing
8200: 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66  .** the union of
8210: 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e   all rowids usin
8220: 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  g a RowSet objec
8230: 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69  t.  This is simi
8240: 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61  lar.** to "bitma
8250: 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74  p indices" in ot
8260: 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67  her database eng
8270: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45  ines..**.** OTHE
8280: 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  RWISE:.**.** If 
8290: 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e  neither case 1 n
82a0: 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c  or case 2 apply,
82b0: 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20   then leave the 
82c0: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
82d0: 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20  .** zero.  This 
82e0: 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66  term is not usef
82f0: 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a  ul for search..*
8300: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
8310: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
8320: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
8330: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
8340: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
8350: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
8360: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
8370: 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57  * the complete W
8380: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
8390: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
83a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
83b0: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65  dex of the OR-te
83c0: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
83d0: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
83e0: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
83f0: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
8400: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
8410: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
8420: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8430: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
8440: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
8450: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  nection */.  Whe
8460: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
8470: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
8480: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
8490: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
84a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
84b0: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
84d0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
84e0: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
84f0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
8500: 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
8510: 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65  askSet; /* Table
8520: 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20   use masks */.  
8530: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8560: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
8570: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
8580: 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b  ;       /* Break
8590: 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f  up of pTerm into
85a0: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57   subterms */.  W
85b0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
85c0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75  m;       /* A Su
85d0: 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  b-term within th
85e0: 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65  e pOrWc */.  Whe
85f0: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
8600: 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69  o;     /* Additi
8610: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
8620: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8630: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d   pTerm */.  Bitm
8640: 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20  ask chngToIN;   
8650: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
8660: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
8670: 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42  fy case 1 */.  B
8680: 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65  itmask indexable
8690: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ;        /* Tabl
86a0: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65  es that are inde
86b0: 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e  xable, satisfyin
86c0: 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f  g case 2 */..  /
86d0: 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65  *.  ** Break the
86e0: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
86f0: 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62  its separate sub
8700: 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74  terms.  The subt
8710: 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74  erms are.  ** st
8720: 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43  ored in a WhereC
8730: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20  lause structure 
8740: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69  containing withi
8750: 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66  n the WhereOrInf
8760: 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68  o.  ** object th
8770: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74  at is attached t
8780: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f  o the original O
8790: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20  R clause term.. 
87a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
87b0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
87c0: 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  (TERM_DYNAMIC|TE
87d0: 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41  RM_ORINFO|TERM_A
87e0: 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  NDINFO))==0 );. 
87f0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
8800: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70  op==TK_OR );.  p
8810: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20  Term->u.pOrInfo 
8820: 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69  = pOrInfo = sqli
8830: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
8840: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49  db, sizeof(*pOrI
8850: 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72  nfo));.  if( pOr
8860: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
8870: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
8880: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46  gs |= TERM_ORINF
8890: 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f  O;.  pOrWc = &pO
88a0: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65  rInfo->wc;.  whe
88b0: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72  reClauseInit(pOr
88c0: 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c  Wc, pWC->pParse,
88d0: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e   pMaskSet, pWC->
88e0: 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 77  wctrlFlags);.  w
88f0: 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c  hereSplit(pOrWc,
8900: 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a   pExpr, TK_OR);.
8910: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
8920: 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20  (pSrc, pOrWc);. 
8930: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
8940: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
8950: 20 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d    assert( pOrWc-
8960: 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20  >nTerm>=2 );..  
8970: 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20  /*.  ** Compute 
8980: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
8990: 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74  s that might sat
89a0: 69 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20  isfy cases 1 or 
89b0: 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61  2..  */.  indexa
89c0: 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ble = ~(Bitmask)
89d0: 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20  0;.  chngToIN = 
89e0: 7e 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20  ~(pWC->vmask);. 
89f0: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
8a00: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
8a10: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26  OrWc->a; i>=0 &&
8a20: 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c   indexable; i--,
8a30: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
8a40: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
8a50: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
8a60: 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NGLE)==0 ){.    
8a70: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
8a80: 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAndInfo;.      
8a90: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8aa0: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b  >eOperator==0 );
8ab0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
8ac0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8ad0: 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   & (TERM_ANDINFO
8ae0: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d  |TERM_ORINFO))==
8af0: 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54  0 );.      chngT
8b00: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  oIN = 0;.      p
8b10: 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  AndInfo = sqlite
8b20: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8b30: 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66   sizeof(*pAndInf
8b40: 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  o));.      if( p
8b50: 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  AndInfo ){.     
8b60: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
8b70: 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20  pAndWC;.        
8b80: 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54  WhereTerm *pAndT
8b90: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  erm;.        int
8ba0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   j;.        Bitm
8bb0: 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20  ask b = 0;.     
8bc0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41     pOrTerm->u.pA
8bd0: 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66  ndInfo = pAndInf
8be0: 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  o;.        pOrTe
8bf0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
8c00: 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20  ERM_ANDINFO;.   
8c10: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f       pOrTerm->eO
8c20: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44  perator = WO_AND
8c30: 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43  ;.        pAndWC
8c40: 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63   = &pAndInfo->wc
8c50: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43  ;.        whereC
8c60: 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43  lauseInit(pAndWC
8c70: 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70  , pWC->pParse, p
8c80: 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77 63  MaskSet, pWC->wc
8c90: 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  trlFlags);.     
8ca0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41     whereSplit(pA
8cb0: 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  ndWC, pOrTerm->p
8cc0: 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  Expr, TK_AND);. 
8cd0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
8ce0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64  zeAll(pSrc, pAnd
8cf0: 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  WC);.        pAn
8d00: 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57  dWC->pOuter = pW
8d10: 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  C;.        testc
8d20: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
8d30: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
8d40: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
8d50: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
8d60: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
8d70: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
8d80: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
8d90: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
8da0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
8db0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
8dc0: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
8dd0: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
8de0: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
8df0: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
8e00: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
8e10: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
8e20: 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74  , pAndTerm->left
8e30: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
8e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8e50: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8e60: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
8e70: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8e80: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
8e90: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
8ea0: 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20  RM_COPIED ){.   
8eb0: 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20     /* Skip this 
8ec0: 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57  term for now.  W
8ed0: 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65  e revisit it whe
8ee0: 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65  n we process the
8ef0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  .      ** corres
8f00: 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52  ponding TERM_VIR
8f10: 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20  TUAL term */.   
8f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
8f30: 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62  tmask b;.      b
8f40: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
8f50: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
8f60: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
8f70: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
8f80: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
8f90: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
8fa0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
8fb0: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
8fc0: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
8fd0: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
8fe0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
8ff0: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
9000: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
9010: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
9020: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  b;.      if( pOr
9030: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
9040: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
9050: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a    chngToIN = 0;.
9060: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9070: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d       chngToIN &=
9080: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
9090: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
90a0: 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20   Record the set 
90b0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
90c0: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
90d0: 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65  The set might be
90e0: 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a  .  ** empty..  *
90f0: 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  /.  pOrInfo->ind
9100: 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62  exable = indexab
9110: 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  le;.  pTerm->eOp
9120: 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62  erator = indexab
9130: 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f  le==0 ? 0 : WO_O
9140: 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68  R;..  /*.  ** ch
9150: 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73  ngToIN holds a s
9160: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
9170: 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66  t *might* satisf
9180: 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20  y case 1.  But. 
9190: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64   ** we have to d
91a0: 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  o some additiona
91b0: 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  l checking to se
91c0: 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c  e if case 1 real
91d0: 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73  ly.  ** is satis
91e0: 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fied..  **.  ** 
91f0: 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f  chngToIN will ho
9200: 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20  ld either 0, 1, 
9210: 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20  or 2 bits.  The 
9220: 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73  0-bit case means
9230: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65  .  ** that there
9240: 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69   is no possibili
9250: 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  ty of transformi
9260: 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ng the OR clause
9270: 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e   into an.  ** IN
9280: 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73   operator becaus
9290: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65  e one or more te
92a0: 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  rms in the OR cl
92b0: 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a  ause contain.  *
92c0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  * something othe
92d0: 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63  r than == on a c
92e0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e  olumn in the sin
92f0: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
9300: 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20  1-bit.  ** case 
9310: 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79  means that every
9320: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20   term of the OR 
9330: 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65  clause is of the
9340: 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c   form.  ** "tabl
9350: 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66  e.column=expr" f
9360: 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74  or some single t
9370: 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62  able.  The one b
9380: 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20  it that is set. 
9390: 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70   ** will corresp
93a0: 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f  ond to the commo
93b0: 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69  n table.  We sti
93c0: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  ll need to check
93d0: 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75   to make.  ** su
93e0: 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  re the same colu
93f0: 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c  mn is used on al
9400: 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d  l terms.  The 2-
9410: 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e  bit case is when
9420: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65  .  ** the all te
9430: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
9440: 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75  orm "table1.colu
9450: 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  mn=table2.column
9460: 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68  ".  It.  ** migh
9470: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
9480: 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72   form an IN oper
9490: 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72  ator with either
94a0: 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20   table1.column. 
94b0: 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f   ** or table2.co
94c0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20  lumn as the LHS 
94d0: 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d  if either is com
94e0: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
94f0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52  m of.  ** the OR
9500: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
9510: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72  ** Note that ter
9520: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
9530: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61  table.column1=ta
9540: 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68  ble.column2" (th
9550: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c  e.  ** same tabl
9560: 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20  e on both sizes 
9570: 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f  of the ==) canno
9580: 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  t be optimized..
9590: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54    */.  if( chngT
95a0: 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  oIN ){.    int o
95b0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
95c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
95d0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  the conversion t
95e0: 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f  o IN is valid */
95f0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  .    int iColumn
9600: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
9610: 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  * Column index o
9620: 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72  n lhs of IN oper
9630: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ator */.    int 
9640: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20  iCursor = -1;   
9650: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
9660: 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20  ursor common to 
9670: 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  all terms */.   
9680: 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20   int j = 0;     
9690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
96a0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
96b0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
96c0: 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c   a table and col
96d0: 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73  umn that appears
96e0: 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   on one side or 
96f0: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
9700: 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61   of the == opera
9710: 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62  tor in every sub
9720: 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c  term.  That tabl
9730: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20  e and column.   
9740: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f   ** will be reco
9750: 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20  rded in iCursor 
9760: 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68  and iColumn.  Th
9770: 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ere might not be
9780: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
9790: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
97a0: 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67  n.  Set okToChng
97b0: 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f  ToIN if an appro
97c0: 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20  priate table.   
97d0: 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69   ** and column i
97e0: 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76  s found but leav
97f0: 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66  e okToChngToIN f
9800: 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e  alse if not foun
9810: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
9820: 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f  r(j=0; j<2 && !o
9830: 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b  kToChngToIN; j++
9840: 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d  ){.      pOrTerm
9850: 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20   = pOrWc->a;.   
9860: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
9870: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
9880: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
9890: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
98a0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
98b0: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
98c0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
98d0: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
98e0: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
98f0: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
9900: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
9910: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
9920: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
9930: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
9940: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
9950: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
9960: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
9970: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
9980: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
9990: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
99a0: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
99b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
99c0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
99d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
99e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
99f0: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
9a00: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  sk(pMaskSet, pOr
9a10: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9a20: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
9a30: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
9a40: 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  must be of the f
9a50: 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77  orm t1.a==t2.b w
9a60: 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68  here t2 is in th
9a70: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
9a80: 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20  hngToIN set but 
9a90: 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73  t1 is not.  This
9aa0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69   term will be ei
9ab0: 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20  ther preceeded. 
9ac0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
9ad0: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
9ae0: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
9af0: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
9b00: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
9b10: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
9b20: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
9b30: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
9b40: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
9b50: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
9b60: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
9b70: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
9b80: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9b90: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
9ba0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9bb0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9bc0: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
9bd0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
9be0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
9bf0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
9c00: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
9c10: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
9c20: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
9c30: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
9c40: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
9c50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9c60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9c70: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
9c80: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
9c90: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
9ca0: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
9cb0: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
9cc0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
9cd0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
9ce0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
9cf0: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
9d00: 20 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54    assert( (chngT
9d10: 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29  oIN&(chngToIN-1)
9d20: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
9d30: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
9d40: 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  ==getMask(pMaskS
9d50: 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a  et, iCursor) );.
9d60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9d70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
9d80: 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a  tcase( j==1 );..
9d90: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
9da0: 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61   found a candida
9db0: 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  te table and col
9dc0: 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  umn.  Check to s
9dd0: 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20  ee if that.     
9de0: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f   ** table and co
9df0: 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  lumn is common t
9e00: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
9e10: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f  the OR clause */
9e20: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
9e30: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
9e40: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
9e50: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
9e60: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
9e70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9e80: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
9e90: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
9ea0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
9eb0: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
9ec0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
9ed0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9ee0: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
9ef0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9f00: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
9f10: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
9f20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
9f30: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
9f40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9f50: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
9f60: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
9f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9f80: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
9f90: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
9fa0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
9fb0: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
9fc0: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
9fd0: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
9fe0: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
9ff0: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
a000: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
a010: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
a020: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
a030: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
a040: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
a050: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
a060: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
a070: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
a080: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
a090: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
a0a0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
a0b0: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
a0c0: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
a0d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
a0e0: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
a0f0: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
a100: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
a110: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
a120: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
a130: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
a140: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
a150: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
a160: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a170: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a180: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
a190: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
a1a0: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
a1b0: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
a1c0: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
a1d0: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
a1e0: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
a1f0: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
a200: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
a210: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
a220: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
a230: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a  operator..    **
a240: 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30  .    ** EV: R-00
a250: 32 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f  211-15100.    */
a260: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
a270: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
a280: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
a290: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
a2a0: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
a2b0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
a2c0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
a2d0: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
a2e0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
a2f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
a300: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
a310: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
a320: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
a330: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
a340: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
a350: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
a360: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
a370: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
a380: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
a390: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
a3a0: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
a3b0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
a3c0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
a3d0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
a3e0: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
a3f0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
a400: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
a410: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
a420: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a430: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
a440: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
a450: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a460: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
a470: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
a480: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
a490: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
a4a0: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
a4b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
a4c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
a4d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
a4e0: 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50  stAppend(pWC->pP
a4f0: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
a500: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
a510: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
a520: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
a530: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
a540: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
a550: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
a560: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
a570: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
a580: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
a590: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
a5a0: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
a5b0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
a5c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
a5d0: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
a5e0: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
a5f0: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
a600: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
a610: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a620: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
a630: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
a640: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
a650: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
a660: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
a670: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
a680: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
a690: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
a6a0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
a6b0: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
a6c0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
a6d0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
a6e0: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
a6f0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
a700: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
a710: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
a720: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
a730: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
a740: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
a750: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a760: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
a770: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
a780: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
a790: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
a7a0: 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20  tor = WO_NOOP;  
a7b0: 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73  /* case 1 trumps
a7c0: 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d   case 2 */.    }
a7d0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
a7e0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52   !SQLITE_OMIT_OR
a7f0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26  _OPTIMIZATION &&
a800: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55   !SQLITE_OMIT_SU
a810: 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  BQUERY */.../*.*
a820: 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74  * The input to t
a830: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
a840: 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75  n WhereTerm stru
a850: 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20  cture with only 
a860: 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66  the.** "pExpr" f
a870: 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20  ield filled in. 
a880: 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
a890: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61   routine is to a
a8a0: 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75  nalyze the.** su
a8b0: 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20  bexpression and 
a8c0: 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65  populate all the
a8d0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
a8e0: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a   the WhereTerm.*
a8f0: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  * structure..**.
a900: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
a910: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
a920: 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e  orm "<expr> <op>
a930: 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d   X" it gets comm
a940: 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73  uted.** to the s
a950: 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20  tandard form of 
a960: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e  "X <op> <expr>".
a970: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
a980: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
a990: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
a9a0: 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20  Y" where both X 
a9b0: 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c  and Y are.** col
a9c0: 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f  umns, then the o
a9d0: 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69  riginal expressi
a9e0: 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  on is unchanged 
a9f0: 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  and a new virtua
aa00: 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65  l.** term of the
aa10: 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22   form "Y <op> X"
aa20: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
aa30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e   WHERE clause an
aa40: 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65  d.** analyzed se
aa50: 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f  parately.  The o
aa60: 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20  riginal term is 
aa70: 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d  marked with TERM
aa80: 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74  _COPIED.** and t
aa90: 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d  he new term is m
aaa0: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
aab0: 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65  DYNAMIC (because
aac0: 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e   it's pExpr.** n
aad0: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
aae0: 20 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43   with the WhereC
aaf0: 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f  lause) and TERM_
ab00: 56 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65  VIRTUAL (because
ab10: 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d   it.** is a comm
ab20: 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70  uted copy of a p
ab30: 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65  rior term.)  The
ab40: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68   original term h
ab50: 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61  as nChild=1.** a
ab60: 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20  nd the copy has 
ab70: 69 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f  idxParent set to
ab80: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
ab90: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e  e original term.
aba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
abb0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53  exprAnalyze(.  S
abc0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
abd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
abe0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
abf0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
ac00: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
ac10: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
ac20: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac40: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65   Index of the te
ac50: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
ac60: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  d */.){.  WhereT
ac70: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
ac80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ac90: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
aca0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lyzed */.  Where
acb0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
acc0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
acd0: 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65  et of table inde
ace0: 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70  x masks */.  Exp
acf0: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ad10: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
ad20: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
ad30: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
ad40: 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  eqLeft;         
ad50: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
ad60: 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78  sites of the pEx
ad70: 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42  pr->pLeft */.  B
ad80: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
ad90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ada0: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
adb0: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42   of pExpr */.  B
adc0: 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68  itmask extraRigh
add0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
ade0: 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65  /* Extra depende
adf0: 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f  ncies on LEFT JO
ae00: 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53  IN */.  Expr *pS
ae10: 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tr1 = 0;        
ae20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
ae30: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
ae40: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
ae50: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
ae70: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
ae80: 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61  ends with wildca
ae90: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61  rd */.  int noCa
aea0: 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
aeb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45           /* LIKE
aec0: 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73  /GLOB distinguis
aed0: 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e  hes case */.  in
aee0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af00: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
af10: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
af20: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
af30: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
af40: 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e;     /* Parsin
af50: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
af60: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
af70: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
af80: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
af90: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
afa0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
afb0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
afc0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
afd0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
afe0: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  .  pMaskSet = pW
aff0: 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70  C->pMaskSet;.  p
b000: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
b010: 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65 66  xpr;.  prereqLef
b020: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
b030: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
b040: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70  pr->pLeft);.  op
b050: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
b060: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
b070: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
b080: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
b090: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
b0a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
b0b0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
b0c0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  .      pTerm->pr
b0d0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
b0e0: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
b0f0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
b100: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
b110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b120: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
b130: 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c  t = exprListTabl
b140: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
b150: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
b160: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
b170: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
b180: 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  L ){.    pTerm->
b190: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
b1a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
b1b0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
b1c0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
b1d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
b1e0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  r->pRight);.  }.
b1f0: 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78    prereqAll = ex
b200: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
b210: 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20  skSet, pExpr);. 
b220: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
b230: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
b240: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
b250: 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d  Bitmask x = getM
b260: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  ask(pMaskSet, pE
b270: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
b280: 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65  able);.    prere
b290: 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65  qAll |= x;.    e
b2a0: 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b  xtraRight = x-1;
b2b0: 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74    /* ON clause t
b2c0: 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  erms may not be 
b2d0: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
b2e0: 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ex.             
b2f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20            ** on 
b300: 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20  left table of a 
b310: 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b  LEFT JOIN.  Tick
b320: 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a  et #3015 */.  }.
b330: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41    pTerm->prereqA
b340: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
b350: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
b360: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  sor = -1;.  pTer
b370: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
b380: 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  .  pTerm->eOpera
b390: 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  tor = 0;.  if( a
b3a0: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26 20  llowedOp(op) && 
b3b0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
b3c0: 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74  ght & prereqLeft
b3d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  )==0 ){.    Expr
b3e0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
b3f0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72  >pLeft;.    Expr
b400: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
b410: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66  ->pRight;.    if
b420: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
b430: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
b440: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
b450: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
b460: 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e;.      pTerm->
b470: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
b480: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
b490: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
b4a0: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
b4b0: 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a  Mask(op);.    }.
b4c0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26      if( pRight &
b4d0: 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  & pRight->op==TK
b4e0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
b4f0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
b500: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  ;.      Expr *pD
b510: 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  up;.      if( pT
b520: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e  erm->leftCursor>
b530: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
b540: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
b550: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
b560: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
b570: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
b580: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
b590: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
b5a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
b5b0: 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20  te(db, pDup);.  
b5c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
b5d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b5e0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
b5f0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
b600: 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52  , pDup, TERM_VIR
b610: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b620: 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  C);.        if( 
b630: 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  idxNew==0 ) retu
b640: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  rn;.        pNew
b650: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
b660: 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w];.        pNew
b670: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
b680: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  erm;.        pTe
b690: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
b6a0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
b6b0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
b6c0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
b6d0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
b6e0: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 7d  _COPIED;.      }
b6f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
b700: 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  up = pExpr;.    
b710: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d      pNew = pTerm
b720: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b730: 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72  exprCommute(pPar
b740: 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  se, pDup);.     
b750: 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70   pLeft = pDup->p
b760: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
b770: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
b780: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
b790: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74      pNew->u.left
b7a0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
b7b0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74  iColumn;.      t
b7c0: 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71  estcase( (prereq
b7d0: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
b7e0: 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74  t) != prereqLeft
b7f0: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
b800: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
b810: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
b820: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65  Right;.      pNe
b830: 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  w->prereqAll = p
b840: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20  rereqAll;.      
b850: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
b860: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70  = operatorMask(p
b870: 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a  Dup->op);.    }.
b880: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
b890: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
b8a0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
b8b0: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
b8c0: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
b8d0: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
b8e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
b8f0: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
b900: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
b910: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
b920: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
b930: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
b940: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
b950: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
b960: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
b970: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
b980: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
b990: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
b9a0: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
b9b0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
b9c0: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
b9d0: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
b9e0: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
b9f0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
ba00: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
ba10: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
ba20: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
ba30: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
ba40: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
ba50: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
ba60: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
ba70: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
ba80: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
ba90: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
baa0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
bab0: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
bac0: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
bad0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
bae0: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
baf0: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
bb00: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
bb10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
bb20: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
bb30: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
bb40: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
bb50: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
bb60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
bb70: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
bb80: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
bb90: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
bba0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
bbb0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
bbc0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
bbd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
bbe0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
bbf0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
bc00: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
bc10: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
bc20: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bc30: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
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 73 71 6c 69 74 65 33 45          sqlite3E
bc60: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
bc70: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bca0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
bcb0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
bcc0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
bcd0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
bce0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
bcf0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
bd00: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
bd10: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
bd20: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
bd30: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
bd40: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
bd50: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
bd60: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
bd70: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
bd80: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
bd90: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
bda0: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
bdb0: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
bdc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bdd0: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
bde0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
bdf0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
be00: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
be10: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
be20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
be30: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
be40: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
be50: 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20  hat is composed 
be60: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
be70: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
be80: 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20  d by.  ** an OR 
be90: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
bea0: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
beb0: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
bec0: 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f    assert( pWC->o
bed0: 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
bee0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
bef0: 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  rm(pSrc, pWC, id
bf00: 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  xTerm);.    pTer
bf10: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
bf20: 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  erm];.  }.#endif
bf30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
bf40: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
bf50: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
bf60: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
bf70: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
bf80: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
bf90: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
bfa0: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
bfb0: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
bfc0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
bfd0: 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74    ** A like patt
bfe0: 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ern of the form 
bff0: 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20  "x LIKE 'abc%'" 
c000: 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20  is changed into 
c010: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
c020: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78  .  **          x
c030: 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61  >='abc' AND x<'a
c040: 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  bd' AND x LIKE '
c050: 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20  abc%'.  **.  ** 
c060: 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  The last charact
c070: 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  er of the prefix
c080: 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d   "abc" is increm
c090: 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  ented to form th
c0a0: 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69  e.  ** terminati
c0b0: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62  on condition "ab
c0c0: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d"..  */.  if( p
c0d0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a  WC->op==TK_AND .
c0e0: 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c     && isLikeOrGl
c0f0: 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
c100: 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d  , &pStr1, &isCom
c110: 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a  plete, &noCase).
c120: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
c130: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Left;       /* L
c140: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
c150: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
c160: 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20  Expr *pStr2;    
c170: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53     /* Copy of pS
c180: 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b  tr1 - RHS of LIK
c190: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
c1a0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  */.    Expr *pNe
c1b0: 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72  wExpr1;.    Expr
c1c0: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
c1d0: 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20   int idxNew1;.  
c1e0: 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20    int idxNew2;. 
c1f0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
c200: 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  l;    /* Collati
c210: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75  ng sequence to u
c220: 73 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74  se */..    pLeft
c230: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
c240: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
c250: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
c260: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
c270: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tr1, 0);.    if(
c280: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
c290: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
c2a0: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
c2b0: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
c2c0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
c2d0: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
c2e0: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
c2f0: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
c300: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
c310: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
c320: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
c330: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
c340: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
c350: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
c360: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
c370: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
c380: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
c390: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
c3a0: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
c3b0: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
c3c0: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
c3d0: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
c3e0: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
c3f0: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
c400: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
c410: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
c420: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
c430: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
c440: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
c450: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
c460: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
c470: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
c480: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
c490: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
c4a0: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
c4b0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c4c0: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
c4d0: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
c4e0: 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33  ;   /* EV: R-643
c4f0: 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20  39-08207 */...  
c500: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
c510: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
c520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c530: 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20  *pC = c + 1;.   
c540: 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73   }.    pColl = s
c550: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
c560: 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
c570: 38 2c 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43  8, noCase ? "NOC
c580: 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 2c  ASE" : "BINARY",
c590: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
c5a0: 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  1 = sqlite3PExpr
c5b0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20  (pParse, TK_GE, 
c5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c5e0: 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33  rSetColl(sqlite3
c5f0: 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74  ExprDup(db,pLeft
c600: 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20  ,0), pColl),.   
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20    pStr1, 0);.   
c630: 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65   idxNew1 = where
c640: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
c650: 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52  , pNewExpr1, TER
c660: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
c670: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
c680: 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d  tcase( idxNew1==
c690: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
c6a0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
c6b0: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
c6c0: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
c6d0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
c6e0: 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_LT,.          
c6f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c700: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71  e3ExprSetColl(sq
c710: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c720: 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29  pLeft,0), pColl)
c730: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c740: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
c750: 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
c760: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
c770: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
c780: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
c790: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
c7a0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
c7b0: 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew2==0 );.    ex
c7c0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
c7d0: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
c7e0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
c7f0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
c800: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
c810: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
c820: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
c830: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
c840: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
c850: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
c860: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
c870: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
c880: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
c890: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
c8a0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
c8b0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
c8c0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
c8d0: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
c8e0: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
c8f0: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
c900: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
c910: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
c920: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
c930: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
c940: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
c950: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
c960: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
c970: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
c980: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
c990: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
c9a0: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
c9b0: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
c9c0: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
c9d0: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
c9e0: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
c9f0: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
ca00: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
ca10: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
ca20: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
ca30: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
ca40: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
ca50: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
ca60: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
ca70: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
ca80: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
ca90: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
caa0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
cab0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
cac0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
cad0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
cae0: 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
caf0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
cb00: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
cb10: 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
cb20: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
cb30: 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
cb40: 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
cb50: 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
cb60: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
cb70: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
cb80: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
cb90: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
cba0: 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
cbd0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
cbe0: 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
cbf0: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
cc00: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
cc10: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
cc20: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
cc30: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
cc40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cc50: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
cc60: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
cc70: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
cc80: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
cc90: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
cca0: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
ccb0: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
ccc0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
ccd0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
cce0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
ccf0: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
cd00: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
cd10: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
cd20: 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
cd30: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
cd40: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
cd50: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
cd60: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
cd70: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
cd80: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
cd90: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
cda0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
cdb0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
cdc0: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
cdd0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
cde0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
cdf0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
ce00: 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
ce10: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
ce20: 54 41 54 33 0a 20 20 2f 2a 20 57 68 65 6e 20 73  TAT3.  /* When s
ce30: 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74  qlite_stat3 hist
ce40: 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
ce50: 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61  ailable an opera
ce60: 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  tor of the.  ** 
ce70: 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e  form "x IS NOT N
ce80: 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d  ULL" can sometim
ce90: 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  es be evaluated 
cea0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
ceb0: 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c  .  ** as "x>NULL
cec0: 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e  " if x is not an
ced0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
cee0: 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72   KEY.  So constr
cef0: 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75  uct a.  ** virtu
cf00: 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20  al term of that 
cf10: 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form..  **.  ** 
cf20: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69  Note that the vi
cf30: 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20  rtual term must 
cf40: 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54  be tagged with T
cf50: 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73  ERM_VNULL.  This
cf60: 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c  .  ** TERM_VNULL
cf70: 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65   tag will suppre
cf80: 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20  ss the not-null 
cf90: 63 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67  check at the beg
cfa0: 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74  inning.  ** of t
cfb0: 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75  he loop.  Withou
cfc0: 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  t the TERM_VNULL
cfd0: 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e   flag, the not-n
cfe0: 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a  ull check at.  *
cff0: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
d000: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65  he loop will pre
d010: 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73  vent any results
d020: 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75   from being retu
d030: 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rned..  */.  if(
d040: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
d050: 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78  OTNULL.   && pEx
d060: 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
d070: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70  K_COLUMN.   && p
d080: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  Expr->pLeft->iCo
d090: 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a 20 20 20  lumn>=0.  ){.   
d0a0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
d0b0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
d0c0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
d0d0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
d0e0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
d0f0: 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
d100: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
d110: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
d120: 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
d150: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d180: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
d190: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
d1a0: 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
d1b0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
d1c0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
d1d0: 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
d200: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
d210: 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
d220: 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
d230: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
d240: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
d250: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
d260: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
d270: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
d280: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
d290: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
d2a0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
d2b0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
d2c0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
d2d0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
d2e0: 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
d2f0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
d300: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
d310: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
d320: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
d330: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
d340: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
d350: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
d360: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
d370: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
d380: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
d390: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
d3a0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
d3b0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
d3c0: 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  STAT */..  /* Pr
d3d0: 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
d3e0: 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
d3f0: 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
d400: 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
d410: 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
d420: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
d430: 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
d440: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
d450: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
d460: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
d470: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
d480: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
d490: 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64 20 61   is UNIQUE and a
d4a0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 70 61 73 74 20  ll columns past 
d4b0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 53 6b  the.** first nSk
d4c0: 69 70 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 4e  ip columns are N
d4d0: 4f 54 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  OT NULL..*/.stat
d4e0: 69 63 20 69 6e 74 20 69 6e 64 65 78 49 73 55 6e  ic int indexIsUn
d4f0: 69 71 75 65 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65  iqueNotNull(Inde
d500: 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 6e 53 6b  x *pIdx, int nSk
d510: 69 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ip){.  Table *pT
d520: 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
d530: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  e;.  int i;.  if
d540: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
d550: 3d 4f 45 5f 4e 6f 6e 65 20 29 20 72 65 74 75 72  =OE_None ) retur
d560: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 6e 53 6b  n 0;.  for(i=nSk
d570: 69 70 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  ip; i<pIdx->nCol
d580: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
d590: 6e 74 20 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt j = pIdx->aiC
d5a0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 69 66  olumn[i];.    if
d5b0: 28 20 6a 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e  ( j>=0 && pTab->
d5c0: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
d5d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
d5e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
d5f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
d600: 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74  ction searches t
d610: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
d620: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
d630: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
d640: 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78 70 72 65  .** for an expre
d650: 73 73 69 6f 6e 20 6f 66 20 74 79 70 65 20 54 4b  ssion of type TK
d660: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65 66  _COLUMN that ref
d670: 65 72 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ers to the same 
d680: 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a 20 75 73  column and.** us
d690: 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
d6a0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
d6b0: 73 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f  s the iCol'th co
d6c0: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
d6d0: 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  dx..** Argument 
d6e0: 69 42 61 73 65 20 69 73 20 74 68 65 20 63 75 72  iBase is the cur
d6f0: 73 6f 72 20 6e 75 6d 62 65 72 20 75 73 65 64 20  sor number used 
d700: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68  for the table th
d710: 61 74 20 70 49 64 78 20 72 65 66 65 72 73 0a 2a  at pIdx refers.*
d720: 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  * to..**.** If s
d730: 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f  uch an expressio
d740: 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20  n is found, its 
d750: 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e  index in pList->
d760: 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  a[] is returned.
d770: 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73   If.** no expres
d780: 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d  sion is found, -
d790: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
d7a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
d7b0: 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72  dIndexCol(.  Par
d7c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d7e0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
d7f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d800: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
d810: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d820: 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20   list to search 
d830: 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20  */.  int iBase, 
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
d860: 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  or table associa
d870: 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f  ted with pIdx */
d880: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d     /* Index to m
d8b0: 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a  atch column of *
d8c0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66      /* Column of
d8f0: 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20   index to match 
d900: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
d910: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
d920: 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
d930: 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28  l[iCol];..  for(
d940: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
d950: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
d960: 78 70 72 20 2a 70 20 3d 20 70 4c 69 73 74 2d 3e  xpr *p = pList->
d970: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
d980: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
d990: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e  LUMN.     && p->
d9a0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
d9b0: 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20  iColumn[iCol].  
d9c0: 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d     && p->iTable=
d9d0: 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20  =iBase.    ){.  
d9e0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
d9f0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
da00: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
da10: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  p);.      if( AL
da20: 57 41 59 53 28 70 43 6f 6c 6c 29 20 26 26 20 30  WAYS(pColl) && 0
da30: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
da40: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  (pColl->zName, z
da50: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  Coll) ){.       
da60: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20   return i;.     
da70: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
da80: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
da90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
daa0: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 70   determines if p
dab0: 49 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  Idx can be used 
dac0: 74 6f 20 61 73 73 69 73 74 20 69 6e 20 70 72 6f  to assist in pro
dad0: 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 44 49 53  cessing a.** DIS
dae0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 2e  TINCT qualifier.
daf0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
db00: 20 69 74 20 74 65 73 74 73 20 77 68 65 74 68 65   it tests whethe
db10: 72 20 6f 72 20 6e 6f 74 20 75 73 69 6e 67 20 74  r or not using t
db20: 68 69 73 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  his.** index for
db30: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
db40: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
db50: 72 6f 77 73 20 77 69 74 68 20 65 71 75 61 6c 20  rows with equal 
db60: 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 61 6c  values for.** al
db70: 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  l expressions in
db80: 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 20 6c   the pDistinct l
db90: 69 73 74 20 61 72 65 20 64 65 6c 69 76 65 72 65  ist are delivere
dba0: 64 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  d grouped togeth
dbb0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  er..**.** For ex
dbc0: 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79  ample, the query
dbd0: 20 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54   .**.**   SELECT
dbe0: 20 44 49 53 54 49 4e 43 54 20 61 2c 20 62 2c 20   DISTINCT a, b, 
dbf0: 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45  c FROM tbl WHERE
dc00: 20 61 20 3d 20 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e   a = ?.**.** can
dc10: 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 61 6e   benefit from an
dc20: 79 20 69 6e 64 65 78 20 6f 6e 20 63 6f 6c 75 6d  y index on colum
dc30: 6e 73 20 22 62 22 20 61 6e 64 20 22 63 22 2e 0a  ns "b" and "c"..
dc40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
dc50: 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28 0a 20  DistinctIndex(. 
dc60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
dc90: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
dca0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
dcb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dcc0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
dcd0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
dd00: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
dd10: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20  */.  int base,  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
dd40: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
dd50: 62 6c 65 20 70 49 64 78 20 69 73 20 6f 6e 20 2a  ble pIdx is on *
dd60: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44  /.  ExprList *pD
dd70: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
dd80: 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49      /* The DISTI
dd90: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 73 20  NCT expressions 
dda0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 20  */.  int nEqCol 
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ddd0: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
dde0: 77 69 74 68 20 3d 3d 20 2a 2f 0a 29 7b 0a 20 20  with == */.){.  
ddf0: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
de00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de10: 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 6e 61 63 63  /* Mask of unacc
de20: 6f 75 6e 74 65 64 20 66 6f 72 20 70 44 69 73 74  ounted for pDist
de30: 69 6e 63 74 20 65 78 70 72 73 20 2a 2f 0a 20 20  inct exprs */.  
de40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
de70: 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  able */..  if( p
de80: 49 64 78 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  Idx->zName==0 ||
de90: 20 70 44 69 73 74 69 6e 63 74 3d 3d 30 20 7c 7c   pDistinct==0 ||
dea0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70   pDistinct->nExp
deb0: 72 3e 3d 42 4d 53 20 29 20 72 65 74 75 72 6e 20  r>=BMS ) return 
dec0: 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  0;.  testcase( p
ded0: 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3d  Distinct->nExpr=
dee0: 3d 42 4d 53 2d 31 20 29 3b 0a 0a 20 20 2f 2a 20  =BMS-1 );..  /* 
def0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
df00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
df10: 20 69 6e 20 74 68 65 20 64 69 73 74 69 6e 63 74   in the distinct
df20: 20 6c 69 73 74 2e 20 49 66 20 61 6e 79 20 6f 66   list. If any of
df30: 20 74 68 65 6d 0a 20 20 2a 2a 20 61 72 65 20 6e   them.  ** are n
df40: 6f 74 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e  ot simple column
df50: 20 72 65 66 65 72 65 6e 63 65 73 2c 20 72 65 74   references, ret
df60: 75 72 6e 20 65 61 72 6c 79 2e 20 4f 74 68 65 72  urn early. Other
df70: 77 69 73 65 2c 20 74 65 73 74 20 69 66 20 74 68  wise, test if th
df80: 65 0a 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61  e.  ** WHERE cla
df90: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22  use contains a "
dfa0: 63 6f 6c 3d 58 22 20 63 6c 61 75 73 65 2e 20 49  col=X" clause. I
dfb0: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 20 65  f it does, the e
dfc0: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 63  xpression.  ** c
dfd0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 49  an be ignored. I
dfe0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 61  f it does not, a
dff0: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 6f  nd the column do
e000: 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 74 6f  es not belong to
e010: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74   the.  ** same t
e020: 61 62 6c 65 20 61 73 20 69 6e 64 65 78 20 70 49  able as index pI
e030: 64 78 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  dx, return early
e040: 2e 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68  . Finally, if th
e050: 65 72 65 20 69 73 20 6e 6f 0a 20 20 2a 2a 20 6d  ere is no.  ** m
e060: 61 74 63 68 69 6e 67 20 22 63 6f 6c 3d 58 22 20  atching "col=X" 
e070: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74  expression and t
e080: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6f 6e 20  he column is on 
e090: 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20 61  the same table a
e0a0: 73 20 70 49 64 78 2c 0a 20 20 2a 2a 20 73 65 74  s pIdx,.  ** set
e0b0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
e0c0: 6e 67 20 62 69 74 20 69 6e 20 76 61 72 69 61 62  ng bit in variab
e0d0: 6c 65 20 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20  le mask..  */.  
e0e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74  for(i=0; i<pDist
e0f0: 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  inct->nExpr; i++
e100: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
e110: 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 45 78 70   *pTerm;.    Exp
e120: 72 20 2a 70 20 3d 20 70 44 69 73 74 69 6e 63 74  r *p = pDistinct
e130: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
e140: 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f    if( p->op!=TK_
e150: 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
e160: 30 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  0;.    pTerm = f
e170: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 70 2d 3e  indTerm(pWC, p->
e180: 69 54 61 62 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75  iTable, p->iColu
e190: 6d 6e 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c  mn, ~(Bitmask)0,
e1a0: 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 20 20   WO_EQ, 0);.    
e1b0: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
e1c0: 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
e1d0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
e1e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 31 20 3d 20    CollSeq *p1 = 
e1f0: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
e200: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
e210: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
e220: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
e230: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 32 20 3d 20    CollSeq *p2 = 
e240: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
e250: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
e260: 20 20 20 20 20 69 66 28 20 70 31 3d 3d 70 32 20       if( p1==p2 
e270: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e280: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  }.    if( p->iTa
e290: 62 6c 65 21 3d 62 61 73 65 20 29 20 72 65 74 75  ble!=base ) retu
e2a0: 72 6e 20 30 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  rn 0;.    mask |
e2b0: 3d 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20  = (((Bitmask)1) 
e2c0: 3c 3c 20 69 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f  << i);.  }..  fo
e2d0: 72 28 69 3d 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b  r(i=nEqCol; mask
e2e0: 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c   && i<pIdx->nCol
e2f0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
e300: 6e 74 20 69 45 78 70 72 20 3d 20 66 69 6e 64 49  nt iExpr = findI
e310: 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20  ndexCol(pParse, 
e320: 70 44 69 73 74 69 6e 63 74 2c 20 62 61 73 65 2c  pDistinct, base,
e330: 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 69   pIdx, i);.    i
e340: 66 28 20 69 45 78 70 72 3c 30 20 29 20 62 72 65  f( iExpr<0 ) bre
e350: 61 6b 3b 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20  ak;.    mask &= 
e360: 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c  ~(((Bitmask)1) <
e370: 3c 20 69 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  < iExpr);.  }.. 
e380: 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 3d 3d 30   return (mask==0
e390: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  );.}.../*.** Ret
e3a0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
e3b0: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
e3c0: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
e3d0: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
e3e0: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
e3f0: 6e 64 61 6e 74 2e 20 41 20 44 49 53 54 49 4e 43  ndant. A DISTINC
e400: 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64  T list is redund
e410: 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62  ant if the datab
e420: 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ase contains a.*
e430: 2a 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 74  * UNIQUE index t
e440: 68 61 74 20 67 75 61 72 61 6e 74 65 65 73 20 74  hat guarantees t
e450: 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hat the result o
e460: 66 20 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c  f the query will
e470: 20 62 65 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20   be distinct.** 
e480: 61 6e 79 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69  anyway..*/.stati
e490: 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74  c int isDistinct
e4a0: 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72  Redundant(.  Par
e4b0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 72  se *pParse,.  Sr
e4c0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
e4d0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
e4e0: 70 57 43 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  pWC,.  ExprList 
e4f0: 2a 70 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20  *pDistinct.){.  
e500: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
e510: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
e520: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
e540: 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f   int iBase;..  /
e550: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
e560: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
e570: 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20  e or sub-select 
e580: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
e590: 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  se of.  ** this 
e5a0: 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77  query, then it w
e5b0: 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
e5c0: 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ble to show that
e5d0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20   the DISTINCT . 
e5e0: 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65   ** clause is re
e5f0: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  dundant. */.  if
e600: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
e610: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
e620: 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69    iBase = pTabLi
e630: 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
e640: 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  ;.  pTab = pTabL
e650: 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
e660: 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
e670: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
e680: 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e  is an IPK column
e690: 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c   on table iBase,
e6a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20   then return .  
e6b0: 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54  ** true. Note: T
e6c0: 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  he (p->iTable==i
e6d0: 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68  Base) part of th
e6e0: 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66  is test may be f
e6f0: 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  alse if the.  **
e700: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
e710: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
e720: 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
e730: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
e740: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
e750: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
e760: 20 3d 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b   = pDistinct->a[
e770: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
e780: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
e790: 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d  MN && p->iTable=
e7a0: 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f  =iBase && p->iCo
e7b0: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
e7c0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  1;.  }..  /* Loo
e7d0: 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e  p through all in
e7e0: 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
e7f0: 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63  le, checking eac
e800: 68 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d  h to see if it m
e810: 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49  akes.  ** the DI
e820: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
e830: 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64   redundant. It d
e840: 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a  oes so if:.  **.
e850: 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e    **   1. The in
e860: 64 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e  dex is itself UN
e870: 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20  IQUE, and.  **. 
e880: 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20   **   2. All of 
e890: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
e8a0: 68 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74  he index are eit
e8b0: 68 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20  her part of the 
e8c0: 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20  pDistinct.  **  
e8d0: 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73      list, or els
e8e0: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
e8f0: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65  se contains a te
e900: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
e910: 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20  col=X",.  **    
e920: 20 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63    where X is a c
e930: 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54  onstant value. T
e940: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
e950: 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20  uences of the.  
e960: 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73  **      comparis
e970: 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69  on and select-li
e980: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  st expressions m
e990: 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20  ust match those 
e9a0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
e9b0: 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c  **.  **   3. All
e9c0: 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20   of those index 
e9d0: 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63  columns for whic
e9e0: 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
e9f0: 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  se does not.  **
ea00: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20        contain a 
ea10: 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65  "col=X" term are
ea20: 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f   subject to a NO
ea30: 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
ea40: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  t..  */.  for(pI
ea50: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
ea60: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
ea70: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
ea80: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
ea90: 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69  =OE_None ) conti
eaa0: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  nue;.    for(i=0
eab0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
eac0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
ead0: 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt iCol = pIdx->
eae0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
eaf0: 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65     if( 0==findTe
eb00: 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69  rm(pWC, iBase, i
eb10: 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30  Col, ~(Bitmask)0
eb20: 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29  , WO_EQ, pIdx) )
eb30: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 49  {.        int iI
eb40: 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65  dxCol = findInde
eb50: 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69  xCol(pParse, pDi
eb60: 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70  stinct, iBase, p
eb70: 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  Idx, i);.       
eb80: 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c   if( iIdxCol<0 |
eb90: 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  | pTab->aCol[pId
eba0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  x->aiColumn[i]].
ebb0: 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  notNull==0 ){.  
ebc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ebd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ebe0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
ebf0: 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
ec00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
ec10: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
ec20: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
ec30: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
ec40: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
ec50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
ec60: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
ec70: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  0;.}../*.** Prep
ec80: 61 72 65 20 61 20 63 72 75 64 65 20 65 73 74 69  are a crude esti
ec90: 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61  mate of the loga
eca0: 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70  rithm of the inp
ecb0: 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65  ut value..** The
ecc0: 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f   results need no
ecd0: 74 20 62 65 20 65 78 61 63 74 2e 20 20 54 68 69  t be exact.  Thi
ece0: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
ecf0: 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a  or estimating.**
ed00: 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20   the total cost 
ed10: 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70  of performing op
ed20: 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 4f 28  erations with O(
ed30: 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e  logN) or O(NlogN
ed40: 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e  ).** complexity.
ed50: 20 20 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a    Because N is j
ed60: 75 73 74 20 61 20 67 75 65 73 73 2c 20 69 74 20  ust a guess, it 
ed70: 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67  is no great trag
ed80: 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69  edy if.** logN i
ed90: 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a  s a little off..
eda0: 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  */.static double
edb0: 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e   estLog(double N
edc0: 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e  ){.  double logN
edd0: 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78   = 1;.  double x
ede0: 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20   = 10;.  while( 
edf0: 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20  N>x ){.    logN 
ee00: 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31  += 1;.    x *= 1
ee10: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
ee20: 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  logN;.}../*.** T
ee30: 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
ee40: 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
ee50: 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
ee60: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
ee70: 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
ee80: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
ee90: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
eea0: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
eeb0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
eec0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
eed0: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
eee0: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
eef0: 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
ef00: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
ef10: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
ef20: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
ef30: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
ef40: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
ef50: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
ef60: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
ef70: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
ef80: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
ef90: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
efa0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
efb0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
efc0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
efd0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
efe0: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
eff0: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
f000: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
f010: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
f020: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
f030: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
f040: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
f050: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
f060: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
f070: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
f080: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
f090: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
f0a0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
f0b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
f0c0: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
f0d0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f0e0: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
f0f0: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
f100: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
f110: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
f120: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
f130: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
f140: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
f150: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
f160: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
f170: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f180: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
f190: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
f1a0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
f1b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
f1c0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
f1d0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
f1e0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
f1f0: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
f200: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
f210: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
f220: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
f230: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
f240: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
f250: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
f260: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
f270: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f280: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
f290: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
f2a0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f2b0: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
f2c0: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
f2d0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f2e0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
f2f0: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
f300: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
f310: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
f320: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
f330: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
f340: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
f350: 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66  t);.}.#else.#def
f360: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ine TRACE_IDX_IN
f370: 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20  PUTS(A).#define 
f380: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
f390: 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  S(A).#endif../* 
f3a0: 0a 2a 2a 20 52 65 71 75 69 72 65 64 20 62 65 63  .** Required bec
f3b0: 61 75 73 65 20 62 65 73 74 49 6e 64 65 78 28 29  ause bestIndex()
f3c0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 62 65   is called by be
f3d0: 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
f3e0: 29 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ) .*/.static voi
f3f0: 64 20 62 65 73 74 49 6e 64 65 78 28 57 68 65 72  d bestIndex(Wher
f400: 65 42 65 73 74 49 64 78 2a 29 3b 0a 0a 2f 2a 0a  eBestIdx*);../*.
f410: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f420: 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
f430: 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20 73 74 72   an scanning str
f440: 61 74 65 67 79 20 74 68 61 74 20 63 61 6e 20 62  ategy that can b
f450: 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70  e used .** to op
f460: 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52 27 20 65  timize an 'OR' e
f470: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
f480: 73 20 70 61 72 74 20 6f 66 20 61 20 57 48 45 52  s part of a WHER
f490: 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a  E clause. .**.**
f4a0: 20 54 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63   The table assoc
f4b0: 69 61 74 65 64 20 77 69 74 68 20 46 52 4f 4d 20  iated with FROM 
f4c0: 63 6c 61 75 73 65 20 74 65 72 6d 20 70 53 72 63  clause term pSrc
f4d0: 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
f4e0: 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42 2d 54 72  .** regular B-Tr
f4f0: 65 65 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69  ee table or a vi
f500: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
f510: 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74  static void best
f520: 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 57 68  OrClauseIndex(Wh
f530: 65 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a  ereBestIdx *p){.
f540: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f550: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
f560: 49 4f 4e 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ION.  WhereClaus
f570: 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b  e *pWC = p->pWC;
f580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f590: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
f5a0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
f5b0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
f5c0: 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20  p->pSrc; /* The 
f5d0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
f5e0: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
f5f0: 63 6f 6e 73 74 20 69 6e 74 20 69 43 75 72 20 3d  const int iCur =
f600: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20   pSrc->iCursor; 
f610: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
f620: 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
f630: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d   */.  const Bitm
f640: 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65  ask maskSrc = ge
f650: 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b  tMask(pWC->pMask
f660: 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20  Set, iCur);  /* 
f670: 42 69 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63  Bitmask for pSrc
f680: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
f690: 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d  * const pWCEnd =
f6a0: 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
f6b0: 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  erm];        /* 
f6c0: 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20  End of pWC->a[] 
f6d0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
f6e0: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
f6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
f700: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
f710: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
f720: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  /..  /* The OR-c
f730: 6c 61 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  lause optimizati
f740: 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  on is disallowed
f750: 20 69 66 20 74 68 65 20 49 4e 44 45 58 45 44 20   if the INDEXED 
f760: 42 59 20 6f 72 0a 20 20 2a 2a 20 4e 4f 54 20 49  BY or.  ** NOT I
f770: 4e 44 45 58 45 44 20 63 6c 61 75 73 65 73 20 61  NDEXED clauses a
f780: 72 65 20 75 73 65 64 20 6f 72 20 69 66 20 74 68  re used or if th
f790: 65 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59  e WHERE_AND_ONLY
f7a0: 20 62 69 74 20 69 73 20 73 65 74 2e 20 2a 2f 0a   bit is set. */.
f7b0: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
f7c0: 6e 64 65 78 65 64 20 7c 7c 20 70 53 72 63 2d 3e  ndexed || pSrc->
f7d0: 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
f7e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
f7f0: 66 28 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61  f( pWC->wctrlFla
f800: 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f  gs & WHERE_AND_O
f810: 4e 4c 59 20 29 7b 0a 20 20 20 20 72 65 74 75 72  NLY ){.    retur
f820: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61  n;.  }..  /* Sea
f830: 72 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  rch the WHERE cl
f840: 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 20 61  ause terms for a
f850: 20 75 73 61 62 6c 65 20 57 4f 5f 4f 52 20 74 65   usable WO_OR te
f860: 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  rm. */.  for(pTe
f870: 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
f880: 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
f890: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
f8a0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
f8b0: 4f 52 20 0a 20 20 20 20 20 26 26 20 28 28 70 54  OR .     && ((pT
f8c0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
f8d0: 20 7e 6d 61 73 6b 53 72 63 29 20 26 20 70 2d 3e   ~maskSrc) & p->
f8e0: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20  notReady)==0.   
f8f0: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
f900: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
f910: 65 20 26 20 6d 61 73 6b 53 72 63 29 21 3d 30 20  e & maskSrc)!=0 
f920: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68  .    ){.      Wh
f930: 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73  ereClause * cons
f940: 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d  t pOrWC = &pTerm
f950: 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
f960: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
f970: 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e   * const pOrWCEn
f980: 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f  d = &pOrWC->a[pO
f990: 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20  rWC->nTerm];.   
f9a0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
f9b0: 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74  rTerm;.      int
f9c0: 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d   flags = WHERE_M
f9d0: 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 64  ULTI_OR;.      d
f9e0: 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30  ouble rTotal = 0
f9f0: 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6e  ;.      double n
fa00: 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 42  Row = 0;.      B
fa10: 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b  itmask used = 0;
fa20: 0a 20 20 20 20 20 20 57 68 65 72 65 42 65 73 74  .      WhereBest
fa30: 49 64 78 20 73 42 4f 49 3b 0a 0a 20 20 20 20 20  Idx sBOI;..     
fa40: 20 73 42 4f 49 20 3d 20 2a 70 3b 0a 20 20 20 20   sBOI = *p;.    
fa50: 20 20 73 42 4f 49 2e 70 4f 72 64 65 72 42 79 20    sBOI.pOrderBy 
fa60: 3d 20 30 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e  = 0;.      sBOI.
fa70: 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  pDistinct = 0;. 
fa80: 20 20 20 20 20 73 42 4f 49 2e 70 70 49 64 78 49       sBOI.ppIdxI
fa90: 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  nfo = 0;.      f
faa0: 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43  or(pOrTerm=pOrWC
fab0: 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72  ->a; pOrTerm<pOr
fac0: 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b  WCEnd; pOrTerm++
fad0: 29 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ){.        WHERE
fae0: 54 52 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74  TRACE(("... Mult
faf0: 69 2d 69 6e 64 65 78 20 4f 52 20 74 65 73 74 69  i-index OR testi
fb00: 6e 67 20 66 6f 72 20 74 65 72 6d 20 25 64 20 6f  ng for term %d o
fb10: 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20  f %d....\n", .  
fb20: 20 20 20 20 20 20 20 20 28 70 4f 72 54 65 72 6d          (pOrTerm
fb30: 20 2d 20 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70   - pOrWC->a), (p
fb40: 54 65 72 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20  Term - pWC->a). 
fb50: 20 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20         ));.     
fb60: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
fb70: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e  eOperator==WO_AN
fb80: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  D ){.          s
fb90: 42 4f 49 2e 70 57 43 20 3d 20 26 70 4f 72 54 65  BOI.pWC = &pOrTe
fba0: 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e  rm->u.pAndInfo->
fbb0: 77 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  wc;.          be
fbc0: 73 74 49 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a  stIndex(&sBOI);.
fbd0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
fbe0: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
fbf0: 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
fc00: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c           WhereCl
fc10: 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 20  ause tempWC;.   
fc20: 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 50         tempWC.pP
fc30: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
fc40: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  se;.          te
fc50: 6d 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20  mpWC.pMaskSet = 
fc60: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20  pWC->pMaskSet;. 
fc70: 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
fc80: 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
fc90: 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f          tempWC.o
fca0: 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
fcb0: 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d        tempWC.a =
fcc0: 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20   pOrTerm;.      
fcd0: 20 20 20 20 74 65 6d 70 57 43 2e 77 63 74 72 6c      tempWC.wctrl
fce0: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20  Flags = 0;.     
fcf0: 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72       tempWC.nTer
fd00: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
fd10: 20 73 42 4f 49 2e 70 57 43 20 3d 20 26 74 65 6d   sBOI.pWC = &tem
fd20: 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 62  pWC;.          b
fd30: 65 73 74 49 6e 64 65 78 28 26 73 42 4f 49 29 3b  estIndex(&sBOI);
fd40: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
fd50: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
fd60: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
fd70: 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20        rTotal += 
fd80: 73 42 4f 49 2e 63 6f 73 74 2e 72 43 6f 73 74 3b  sBOI.cost.rCost;
fd90: 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  .        nRow +=
fda0: 20 73 42 4f 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e   sBOI.cost.plan.
fdb0: 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73  nRow;.        us
fdc0: 65 64 20 7c 3d 20 73 42 4f 49 2e 63 6f 73 74 2e  ed |= sBOI.cost.
fdd0: 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  used;.        if
fde0: 28 20 72 54 6f 74 61 6c 3e 3d 70 2d 3e 63 6f 73  ( rTotal>=p->cos
fdf0: 74 2e 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b  t.rCost ) break;
fe00: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
fe10: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
fe20: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
fe30: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
fe40: 73 63 61 6e 20 63 6f 73 74 20 74 6f 20 61 63 63  scan cost to acc
fe50: 6f 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 66  ount .      ** f
fe60: 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  or the cost of t
fe70: 68 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20  he sort. */.    
fe80: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
fe90: 79 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y!=0 ){.        
fea0: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
feb0: 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73   sorting increas
fec0: 65 73 20 4f 52 20 63 6f 73 74 20 25 2e 39 67 20  es OR cost %.9g 
fed0: 74 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20 20  to %.9g\n",.    
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 72 54 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e  rTotal, rTotal+n
ff00: 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29  Row*estLog(nRow)
ff10: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74  ));.        rTot
ff20: 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f  al += nRow*estLo
ff30: 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d  g(nRow);.      }
ff40: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
ff50: 65 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69  e cost of scanni
ff60: 6e 67 20 75 73 69 6e 67 20 74 68 69 73 20 4f 52  ng using this OR
ff70: 20 74 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d 69   term for optimi
ff80: 7a 61 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  zation is.      
ff90: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
ffa0: 20 63 75 72 72 65 6e 74 20 63 6f 73 74 20 73 74   current cost st
ffb0: 6f 72 65 64 20 69 6e 20 70 43 6f 73 74 2c 20 72  ored in pCost, r
ffc0: 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
ffd0: 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  nts.      ** of 
ffe0: 70 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  pCost. */.      
fff0: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
10000 20 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20   multi-index OR 
10010 63 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25  cost=%.9g nrow=%
10020 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c 20  .9g\n", rTotal, 
10030 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66  nRow));.      if
10040 28 20 72 54 6f 74 61 6c 3c 70 2d 3e 63 6f 73 74  ( rTotal<p->cost
10050 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  .rCost ){.      
10060 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20    p->cost.rCost 
10070 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = rTotal;.      
10080 20 20 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 3d    p->cost.used =
10090 20 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20 70   used;.        p
100a0 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77  ->cost.plan.nRow
100b0 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20   = nRow;.       
100c0 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
100d0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
100e0 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70         p->cost.p
100f0 6c 61 6e 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54  lan.u.pTerm = pT
10100 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
10110 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
10120 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
10130 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
10140 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10150 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
10160 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74  _INDEX./*.** Ret
10170 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
10180 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
10190 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20  m pTerm is of a 
101a0 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a  form where it.**
101b0 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77   could be used w
101c0 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ith an index to 
101d0 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73  access pSrc, ass
101e0 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72  uming an appropr
101f0 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78  iate.** index ex
10200 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  isted..*/.static
10210 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76   int termCanDriv
10220 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54  eIndex(.  WhereT
10230 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20  erm *pTerm,     
10240 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
10250 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  E clause term to
10260 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75   check */.  stru
10270 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
10280 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61  *pSrc,     /* Ta
10290 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e  ble we are tryin
102a0 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  g to access */. 
102b0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
102c0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
102d0 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74  /* Tables in out
102e0 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20  er loops of the 
102f0 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  join */.){.  cha
10300 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65  r aff;.  if( pTe
10310 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
10320 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
10330 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
10340 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
10350 21 3d 57 4f 5f 45 51 20 29 20 72 65 74 75 72 6e  !=WO_EQ ) return
10360 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
10370 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
10380 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72  notReady)!=0 ) r
10390 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d  eturn 0;.  aff =
103a0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
103b0 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  l[pTerm->u.leftC
103c0 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
103d0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
103e0 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
103f0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66  Term->pExpr, aff
10400 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
10410 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
10420 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
10430 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
10440 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 49 66  C_INDEX./*.** If
10450 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
10460 66 6f 72 20 70 53 72 63 20 73 70 65 63 69 66 69  for pSrc specifi
10470 65 64 20 69 6e 20 70 43 6f 73 74 20 69 73 20 61  ed in pCost is a
10480 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
10490 0a 2a 2a 20 61 6e 64 20 69 6e 64 65 78 69 6e 67  .** and indexing
104a0 20 69 73 20 61 6c 6c 6f 77 73 20 28 69 66 20 74   is allows (if t
104b0 68 65 72 65 20 69 73 20 6e 6f 20 4e 4f 54 20 49  here is no NOT I
104c0 4e 44 45 58 45 44 20 63 6c 61 75 73 65 29 20 61  NDEXED clause) a
104d0 6e 64 20 69 74 0a 2a 2a 20 70 6f 73 73 69 62 6c  nd it.** possibl
104e0 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  e to construct a
104f0 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
10500 20 74 68 61 74 20 77 6f 75 6c 64 20 70 65 72 66   that would perf
10510 6f 72 6d 20 62 65 74 74 65 72 0a 2a 2a 20 74 68  orm better.** th
10520 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  an a full table 
10530 73 63 61 6e 20 65 76 65 6e 20 77 68 65 6e 20 74  scan even when t
10540 68 65 20 63 6f 73 74 20 6f 66 20 63 6f 6e 73 74  he cost of const
10550 72 75 63 74 69 6e 67 20 74 68 65 20 69 6e 64 65  ructing the inde
10560 78 0a 2a 2a 20 69 73 20 74 61 6b 65 6e 20 69 6e  x.** is taken in
10570 74 6f 20 61 63 63 6f 75 6e 74 2c 20 74 68 65 6e  to account, then
10580 20 61 6c 74 65 72 20 74 68 65 20 71 75 65 72 79   alter the query
10590 20 70 6c 61 6e 20 74 6f 20 75 73 65 20 74 68 65   plan to use the
105a0 0a 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  .** transient in
105b0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
105c0 6f 69 64 20 62 65 73 74 41 75 74 6f 6d 61 74 69  oid bestAutomati
105d0 63 49 6e 64 65 78 28 57 68 65 72 65 42 65 73 74  cIndex(WhereBest
105e0 49 64 78 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  Idx *p){.  Parse
105f0 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
10600 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
10610 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
10620 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
10630 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20  reClause *pWC = 
10640 70 2d 3e 70 57 43 3b 20 20 20 20 20 20 20 20 20  p->pWC;         
10650 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
10660 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
10670 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
10680 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
10690 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
106a0 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
106b0 72 63 68 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  rch */.  double 
106c0 6e 54 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20  nTableRow;      
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
106e0 2a 20 52 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * Rows in the in
106f0 70 75 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 64  put table */.  d
10700 6f 75 62 6c 65 20 6c 6f 67 4e 3b 20 20 20 20 20  ouble logN;     
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62       /* log(nTab
10730 6c 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62  leRow) */.  doub
10740 6c 65 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 20  le costTempIdx; 
10750 20 20 20 20 20 20 20 20 2f 2a 20 70 65 72 2d 71          /* per-q
10760 75 65 72 79 20 63 6f 73 74 20 6f 66 20 74 68 65  uery cost of the
10770 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
10780 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
10790 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
107a0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
107b0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
107c0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
107d0 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
107e0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
107f0 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
10800 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
10810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10820 61 62 6c 65 20 74 68 74 20 6d 69 67 68 74 20 62  able tht might b
10830 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  e indexed */..  
10840 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  if( pParse->nQue
10850 72 79 4c 6f 6f 70 3c 3d 28 64 6f 75 62 6c 65 29  ryLoop<=(double)
10860 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  1 ){.    /* Ther
10870 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
10880 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
10890 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 66 6f 72  omatic index for
108a0 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 2a   a single scan *
108b0 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
108c0 7d 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d  }.  if( (pParse-
108d0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
108e0 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 3d 3d  ITE_AutoIndex)==
108f0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75 74 6f  0 ){.    /* Auto
10900 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 61 72  matic indices ar
10910 65 20 64 69 73 61 62 6c 65 64 20 61 74 20 72 75  e disabled at ru
10920 6e 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20 72 65  n-time */.    re
10930 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
10940 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73  (p->cost.plan.ws
10950 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
10960 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 20 29  T_FULLSCAN)!=0 )
10970 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c 72 65  {.    /* We alre
10980 61 64 79 20 68 61 76 65 20 73 6f 6d 65 20 6b 69  ady have some ki
10990 6e 64 20 6f 66 20 69 6e 64 65 78 20 69 6e 20 75  nd of index in u
109a0 73 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  se for this quer
109b0 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
109c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
109d0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a  ->notIndexed ){.
109e0 20 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49      /* The NOT I
109f0 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 61 70  NDEXED clause ap
10a00 70 65 61 72 73 20 69 6e 20 74 68 65 20 53 51 4c  pears in the SQL
10a10 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
10a20 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
10a30 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 29 7b  >isCorrelated ){
10a40 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72  .    /* The sour
10a50 63 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  ce is a correlat
10a60 65 64 20 73 75 62 2d 71 75 65 72 79 2e 20 4e 6f  ed sub-query. No
10a70 20 70 6f 69 6e 74 20 69 6e 20 69 6e 64 65 78 69   point in indexi
10a80 6e 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65  ng it. */.    re
10a90 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  turn;.  }..  ass
10aa0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51 75  ert( pParse->nQu
10ab0 65 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62  eryLoop >= (doub
10ac0 6c 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c 65  le)1 );.  pTable
10ad0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
10ae0 20 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54 61   nTableRow = pTa
10af0 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  ble->nRowEst;.  
10b00 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54  logN = estLog(nT
10b10 61 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74  ableRow);.  cost
10b20 54 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e  TempIdx = 2*logN
10b30 2a 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61 72  *(nTableRow/pPar
10b40 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b  se->nQueryLoop +
10b50 20 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74 54   1);.  if( costT
10b60 65 6d 70 49 64 78 3e 3d 70 2d 3e 63 6f 73 74 2e  empIdx>=p->cost.
10b70 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  rCost ){.    /* 
10b80 54 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61  The cost of crea
10b90 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  ting the transie
10ba0 6e 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62  nt table would b
10bb0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20  e greater than. 
10bc0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20     ** doing the 
10bd0 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
10be0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
10bf0 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
10c00 66 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79  for any equality
10c10 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d   comparison term
10c20 20 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26   */.  pWCEnd = &
10c30 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
10c40 6d 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  m];.  for(pTerm=
10c50 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
10c60 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
10c70 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
10c80 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
10c90 20 70 53 72 63 2c 20 70 2d 3e 6e 6f 74 52 65 61   pSrc, p->notRea
10ca0 64 79 29 20 29 7b 0a 20 20 20 20 20 20 57 48 45  dy) ){.      WHE
10cb0 52 45 54 52 41 43 45 28 28 22 61 75 74 6f 2d 69  RETRACE(("auto-i
10cc0 6e 64 65 78 20 72 65 64 75 63 65 73 20 63 6f 73  ndex reduces cos
10cd0 74 20 66 72 6f 6d 20 25 2e 31 66 20 74 6f 20 25  t from %.1f to %
10ce0 2e 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  .1f\n",.        
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63              p->c
10d00 6f 73 74 2e 72 43 6f 73 74 2c 20 63 6f 73 74 54  ost.rCost, costT
10d10 65 6d 70 49 64 78 29 29 3b 0a 20 20 20 20 20 20  empIdx));.      
10d20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20  p->cost.rCost = 
10d30 63 6f 73 74 54 65 6d 70 49 64 78 3b 0a 20 20 20  costTempIdx;.   
10d40 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e     p->cost.plan.
10d50 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20 31 3b  nRow = logN + 1;
10d60 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70  .      p->cost.p
10d70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48  lan.wsFlags = WH
10d80 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ERE_TEMP_INDEX;.
10d90 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 75 73        p->cost.us
10da0 65 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ed = pTerm->prer
10db0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62  eqRight;.      b
10dc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
10dd0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
10de0 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e   bestAutomaticIn
10df0 64 65 78 28 41 29 20 20 2f 2a 20 6e 6f 2d 6f 70  dex(A)  /* no-op
10e00 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   */.#endif /* SQ
10e10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
10e20 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23  TIC_INDEX */...#
10e30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10e40 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
10e50 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  EX./*.** Generat
10e60 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72  e code to constr
10e70 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
10e80 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f  ject for an auto
10e90 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61  matic index.** a
10ea0 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  nd to set up the
10eb0 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65   WhereLevel obje
10ec0 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61  ct pLevel so tha
10ed0 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
10ee0 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73  ator.** makes us
10ef0 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74  e of the automat
10f00 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ic index..*/.sta
10f10 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75  tic void constru
10f20 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
10f30 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10f40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10f50 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
10f60 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
10f70 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
10f80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
10f90 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
10fa0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
10fb0 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
10fc0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10fd0 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20  term to get the 
10fe0 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  next index */.  
10ff0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
11000 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
11010 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
11020 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
11030 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
11040 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20  Level *pLevel   
11050 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
11060 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a  new index here *
11070 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  /.){.  int nColu
11080 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
11090 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
110a0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
110b0 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78  onstructed index
110c0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
110d0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
110e0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
110f0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
11100 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
11110 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
11120 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
11130 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
11140 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
11150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
11160 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  yte of memory ne
11170 65 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f  eded for pIdx */
11180 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
111a0 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
111b0 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
111c0 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
111d0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
111e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
111f0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
11200 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
11210 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  n */.  int addrI
11220 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
11230 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
11240 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
11250 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20  ion bypass jump 
11260 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
11270 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
11280 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
11290 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  ing indexed */. 
112a0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e   KeyInfo *pKeyin
112b0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
112c0 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
112d0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
112e0 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f     .  int addrTo
112f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
11300 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
11310 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20  index fill loop 
11320 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
11330 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
11340 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
11350 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65  ding an index re
11360 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
11390 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
113a0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
113b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
113c0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
113d0 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20  t mxBitCol;     
113e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
113f0 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  imum column in p
11400 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a  Src->colUsed */.
11410 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
11420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11430 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
11440 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
11450 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  mn */.  Bitmask 
11460 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
11470 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
11480 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
11490 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
114a0 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
114b0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
114c0 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
114d0 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a  nal columns */..
114e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
114f0 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20  de to skip over 
11500 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64  the creation and
11510 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
11520 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  of the.  ** tran
11530 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32  sient index on 2
11540 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
11550 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20  t iterations of 
11560 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76  the loop. */.  v
11570 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
11580 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
11590 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d   );.  addrInit =
115a0 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
115b0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
115c0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
115d0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
115e0 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
115f0 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
11600 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
11610 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
11620 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
11630 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20   nColumn = 0;.  
11640 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
11650 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
11660 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
11670 72 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  rm];.  idxCols =
11680 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
11690 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
116a0 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
116b0 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
116c0 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
116d0 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
116e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
116f0 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
11700 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
11710 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
11720 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69  iCol>=BMS ? ((Bi
11730 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
11740 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29  ) : ((Bitmask)1)
11750 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65  <<iCol;.      te
11760 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
11770 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
11780 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
11790 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
117a0 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
117b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43  =0 ){.        nC
117c0 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
117d0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
117e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
117f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
11800 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
11810 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d  evel->plan.nEq =
11820 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20   nColumn;..  /* 
11830 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
11840 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
11850 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
11860 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63   create a.  ** c
11870 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
11880 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  A "covering inde
11890 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  x" is an index t
118a0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
118b0 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  .  ** columns th
118c0 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  at are needed by
118d0 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74   the query.  Wit
118e0 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  h a covering ind
118f0 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69  ex, the.  ** ori
11900 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65  ginal table neve
11910 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63  r needs to be ac
11920 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74  cessed.  Automat
11930 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a  ic indices must.
11940 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69    ** be a coveri
11950 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65  ng index because
11960 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
11970 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69  not be updated i
11980 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  f the.  ** origi
11990 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65  nal table change
119a0 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
119b0 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  and table cannot
119c0 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20   both be used.  
119d0 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75  ** if they go ou
119e0 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a  t of sync..  */.
119f0 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53    extraCols = pS
11a00 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e  rc->colUsed & (~
11a10 69 64 78 43 6f 6c 73 20 7c 20 28 28 28 42 69 74  idxCols | (((Bit
11a20 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
11a30 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
11a40 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e   (pTable->nCol >
11a50 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31  = BMS-1) ? BMS-1
11a60 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   : pTable->nCol;
11a70 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
11a80 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
11a90 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
11aa0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
11ab0 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
11ac0 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
11ad0 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
11ae0 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61  aCols & (((Bitma
11af0 73 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c  sk)1)<<i) ) nCol
11b00 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  umn++;.  }.  if(
11b10 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
11b20 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
11b30 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20  (BMS-1)) ){.    
11b40 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c  nColumn += pTabl
11b50 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
11b60 31 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d  1;.  }.  pLevel-
11b70 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  >plan.wsFlags |=
11b80 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
11b90 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
11ba0 59 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a  Y | WO_EQ;..  /*
11bb0 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
11bc0 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
11bd0 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
11be0 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20  ex */.  nByte = 
11bf0 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20  sizeof(Index);. 
11c00 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
11c10 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20  n*sizeof(int);  
11c20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
11c30 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20  lumn */.  nByte 
11c40 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f  += nColumn*sizeo
11c50 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49  f(char*);   /* I
11c60 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20  ndex.azColl */. 
11c70 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
11c80 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
11c90 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
11ca0 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78  tOrder */.  pIdx
11cb0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11cc0 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
11cd0 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
11ce0 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
11cf0 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  n;.  pLevel->pla
11d00 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  n.u.pIdx = pIdx;
11d10 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
11d20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b  = (char**)&pIdx[
11d30 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f  1];.  pIdx->aiCo
11d40 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
11d50 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75  dx->azColl[nColu
11d60 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f  mn];.  pIdx->aSo
11d70 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
11d80 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
11d90 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d  Column];.  pIdx-
11da0 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69  >zName = "auto-i
11db0 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e  ndex";.  pIdx->n
11dc0 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e  Column = nColumn
11dd0 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ;.  pIdx->pTable
11de0 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d   = pTable;.  n =
11df0 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20   0;.  idxCols = 
11e00 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
11e10 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
11e20 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
11e30 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
11e40 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
11e50 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
11e60 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
11e70 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
11e80 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
11e90 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
11ea0 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74  Col>=BMS ? ((Bit
11eb0 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
11ec0 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   : ((Bitmask)1)<
11ed0 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28  <iCol;.      if(
11ee0 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73   (idxCols & cMas
11ef0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
11f00 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
11f10 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
11f20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
11f30 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  sk;.        pIdx
11f40 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
11f50 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
11f60 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  umn;.        pCo
11f70 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
11f80 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
11f90 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
11fa0 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
11fb0 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
11fc0 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59  zColl[n] = ALWAY
11fd0 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c  S(pColl) ? pColl
11fe0 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52  ->zName : "BINAR
11ff0 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b  Y";.        n++;
12000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12010 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33   }.  assert( (u3
12020 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61  2)n==pLevel->pla
12030 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41  n.nEq );..  /* A
12040 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  dd additional co
12050 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
12060 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74  make the automat
12070 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20  ic index into.  
12080 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ** a covering in
12090 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  dex */.  for(i=0
120a0 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
120b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
120c0 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61  aCols & (((Bitma
120d0 73 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20 20  sk)1)<<i) ){.   
120e0 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
120f0 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
12100 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
12110 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
12120 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
12130 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
12140 55 73 65 64 20 26 20 28 28 28 42 69 74 6d 61 73  Used & (((Bitmas
12150 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29  k)1)<<(BMS-1)) )
12160 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
12170 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
12180 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
12190 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
121a0 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
121b0 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
121c0 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
121d0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
121e0 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d  ssert( n==nColum
121f0 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n );..  /* Creat
12200 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
12210 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69  index */.  pKeyi
12220 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  nfo = sqlite3Ind
12230 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
12240 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72  , pIdx);.  asser
12250 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
12260 75 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  ur>=0 );.  sqlit
12270 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12280 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78  OP_OpenAutoindex
12290 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
122a0 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c  r, nColumn+1, 0,
122b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
122c0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
122d0 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  info, P4_KEYINFO
122e0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62  _HANDOFF);.  Vdb
122f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
12300 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
12310 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
12320 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
12330 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
12340 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
12350 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12360 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
12370 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
12380 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  ur);.  regRecord
12390 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
123a0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
123b0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
123c0 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
123d0 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  pIdx, pLevel->iT
123e0 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  abCur, regRecord
123f0 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
12400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12410 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
12420 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
12430 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
12440 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12450 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
12460 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65  ESULT);.  sqlite
12470 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12480 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e  P_Next, pLevel->
12490 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70  iTabCur, addrTop
124a0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
124b0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
124c0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
124d0 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71  AUTOINDEX);.  sq
124e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
124f0 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
12500 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
12510 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
12520 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20  egRecord);.  .  
12530 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
12540 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
12550 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
12560 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
12570 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
12580 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  it);.}.#endif /*
12590 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
125a0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
125b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
125c0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
125d0 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
125e0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
125f0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
12600 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
12610 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
12620 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
12630 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
12640 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
12650 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
12660 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
12670 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
12680 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
12690 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
126a0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
126b0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
126c0 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
126d0 49 6e 66 6f 28 57 68 65 72 65 42 65 73 74 49 64  Info(WhereBestId
126e0 78 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  x *p){.  Parse *
126f0 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
12700 73 65 3b 20 0a 20 20 57 68 65 72 65 43 6c 61 75  se; .  WhereClau
12710 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43  se *pWC = p->pWC
12720 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
12730 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
12740 70 2d 3e 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  p->pSrc;.  ExprL
12750 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
12760 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
12770 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
12780 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73  Term;.  struct s
12790 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
127a0 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
127b0 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
127c0 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
127d0 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a  y *pIdxOrderBy;.
127e0 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
127f0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
12800 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
12810 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
12820 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  erm;.  int nOrde
12830 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  rBy;.  sqlite3_i
12840 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
12850 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54 52 41  nfo;..  WHERETRA
12860 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67  CE(("Recomputing
12870 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20   index info for 
12880 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e  %s...\n", pSrc->
12890 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  pTab->zName));..
128a0 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
128b0 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c  umber of possibl
128c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
128d0 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72  onstraints refer
128e0 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69  ring.  ** to thi
128f0 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
12900 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  */.  for(i=nTerm
12910 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
12920 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
12930 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
12940 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
12950 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
12960 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
12970 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
12980 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
12990 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65  tor&(pTerm->eOpe
129a0 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a  rator-1))==0 );.
129b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
129c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
129d0 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
129e0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
129f0 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
12a00 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
12a10 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
12a20 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c   (WO_IN|WO_ISNUL
12a30 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
12a40 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
12a50 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
12a60 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
12a70 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
12a80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
12a90 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
12aa0 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
12ab0 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
12ac0 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
12ad0 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
12ae0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
12af0 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
12b00 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
12b10 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
12b20 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
12b30 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
12b40 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
12b50 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72  .    int n = pOr
12b60 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
12b70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
12b80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
12b90 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
12ba0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
12bb0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
12bc0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
12bd0 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
12be0 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
12bf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12c00 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20    if( i==n){.   
12c10 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b     nOrderBy = n;
12c20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12c30 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
12c40 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
12c50 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
12c60 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
12c70 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
12c80 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
12c90 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cb0 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
12cc0 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
12cd0 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
12ce0 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d00 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
12d10 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
12d20 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
12d30 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
12d40 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12d50 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
12d60 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20  emory");.    /* 
12d70 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73  (double)0 In cas
12d80 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
12d90 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
12da0 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  .. */.    return
12db0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   0;.  }..  /* In
12dc0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
12dd0 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
12de0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12df0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
12e00 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65  ns.  ** many fie
12e10 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63  lds that are dec
12e20 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f  lared "const" to
12e30 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e   prevent xBestIn
12e40 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68  dex from.  ** ch
12e50 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65  anging them.  We
12e60 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
12e70 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69   funky casting i
12e80 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
12e90 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65  initialize those
12ea0 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20   fields..  */.  
12eb0 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75  pIdxCons = (stru
12ec0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
12ed0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49  _constraint*)&pI
12ee0 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64  dxInfo[1];.  pId
12ef0 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75  xOrderBy = (stru
12f00 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
12f10 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43  _orderby*)&pIdxC
12f20 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55  ons[nTerm];.  pU
12f30 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73  sage = (struct s
12f40 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
12f50 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26  straint_usage*)&
12f60 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64  pIdxOrderBy[nOrd
12f70 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29  erBy];.  *(int*)
12f80 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
12f90 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
12fa0 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
12fb0 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
12fc0 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
12fd0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
12fe0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
12ff0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13000 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73  raint = pIdxCons
13010 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
13020 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
13030 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  by**)&pIdxInfo->
13040 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f  aOrderBy = pIdxO
13050 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
13060 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13070 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
13080 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  e**)&pIdxInfo->a
13090 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20  ConstraintUsage 
130a0 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20       pUsage;..  
130f0 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
13100 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
13110 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
13120 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
13130 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
13140 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
13150 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13160 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
13170 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72  >eOperator&(pTer
13180 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29  m->eOperator-1))
13190 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
131a0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
131b0 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a  rator==WO_IN );.
131c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
131d0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
131e0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
131f0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
13200 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
13210 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74  O_ISNULL) ) cont
13220 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
13230 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
13240 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74  ERM_VNULL ) cont
13250 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f  inue;.    pIdxCo
13260 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  ns[j].iColumn = 
13270 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
13280 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  umn;.    pIdxCon
13290 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[j].iTermOffset
132a0 20 3d 20 69 3b 0a 20 20 20 20 70 49 64 78 43 6f   = i;.    pIdxCo
132b0 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 70  ns[j].op = (u8)p
132c0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b  Term->eOperator;
132d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
132e0 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
132f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
13300 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
13310 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
13320 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
13330 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
13340 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
13350 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
13360 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
13370 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
13380 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
13390 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
133a0 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
133b0 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
133c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
133d0 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
133e0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
133f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
13400 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
13410 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
13420 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
13430 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
13440 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
13450 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13460 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
13470 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
13480 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
13490 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
134a0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
134b0 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
134c0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
134d0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
134e0 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
134f0 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
13500 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  CH) );.    j++;.
13510 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
13520 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
13530 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
13540 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
13550 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
13560 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
13570 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
13580 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
13590 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
135a0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
135b0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
135c0 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
135d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
135e0 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
135f0 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
13600 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13610 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
13620 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
13630 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
13640 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
13650 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
13660 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
13670 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
13680 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
13690 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
136a0 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65  ndex_info pointe
136b0 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  r passed.** as t
136c0 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  he argument..**.
136d0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
136e0 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73  ccurs, pParse is
136f0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
13700 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
13710 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65   and a.** non-ze
13720 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  ro value is retu
13730 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
13740 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61   0 is returned a
13750 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
13760 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c   part of the sql
13770 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13780 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66  structure is lef
13790 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a  t populated..**.
137a0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
137b0 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
137c0 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68  turned, it is th
137d0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
137e0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
137f0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
13800 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69  free p->idxStr i
13810 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  f p->needToFreeI
13820 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a  dxStr indicates.
13830 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
13840 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
13850 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74  tic int vtabBest
13860 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
13870 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
13880 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
13890 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69  info *p){.  sqli
138a0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
138b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
138c0 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
138d0 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69  Tab)->pVtab;.  i
138e0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
138f0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
13900 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25  xBestIndex for %
13910 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  s\n", pTab->zNam
13920 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58  e));.  TRACE_IDX
13930 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63  _INPUTS(p);.  rc
13940 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
13950 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56  e->xBestIndex(pV
13960 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45  tab, p);.  TRACE
13970 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b  _IDX_OUTPUTS(p);
13980 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
13990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
139a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
139b0 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  M ){.      pPars
139c0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
139d0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  led = 1;.    }el
139e0 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a  se if( !pVtab->z
139f0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
13a00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13a10 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71  pParse, "%s", sq
13a20 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29  lite3ErrStr(rc))
13a30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13a40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13a50 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
13a60 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
13a70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
13a80 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
13a90 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
13aa0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
13ab0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
13ac0 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
13ad0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
13ae0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
13af0 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43  .usable && p->aC
13b00 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
13b10 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
13b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
13b30 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
13b40 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
13b50 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20   %s: xBestIndex 
13b60 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61  returned an inva
13b70 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d  lid plan", pTab-
13b80 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
13b90 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61   }..  return pPa
13ba0 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f  rse->nErr;.}.../
13bb0 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
13bc0 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20   best index for 
13bd0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
13be0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20  .**.** The best 
13bf0 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65  index is compute
13c00 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
13c10 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  dex method of th
13c20 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62  e virtual.** tab
13c30 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73  le module.  This
13c40 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c   routine is real
13c50 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70 65  ly just a wrappe
13c60 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a  r that sets up.*
13c70 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
13c80 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
13c90 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20  re that is used 
13ca0 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77  to communicate w
13cb0 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65  ith.** xBestInde
13cc0 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f  x..**.** In a jo
13cd0 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  in, this routine
13ce0 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64   might be called
13cf0 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
13d00 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  for the.** same 
13d10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
13d20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
13d30 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
13d40 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
13d50 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f  nd initialized o
13d60 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f  n the first invo
13d70 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  cation and reuse
13d80 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75  d on all subsequ
13d90 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f  ent.** invocatio
13da0 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ns.  The sqlite3
13db0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
13dc0 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73  cture is also us
13dd0 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20  ed when.** code 
13de0 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
13df0 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74 75  access the virtu
13e00 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77  al table.  The w
13e10 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29  hereInfoDelete()
13e20 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b   .** routine tak
13e30 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65 69  es care of freei
13e40 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ng the sqlite3_i
13e50 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
13e60 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65  ure after.** eve
13e70 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73  rybody has finis
13e80 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a  hed with it..*/.
13e90 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74  static void best
13ea0 56 69 72 74 75 61 6c 49 6e 64 65 78 28 57 68 65  VirtualIndex(Whe
13eb0 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20  reBestIdx *p){. 
13ec0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
13ed0 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20   p->pParse;     
13ee0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
13ef0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
13f00 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20  reClause *pWC = 
13f10 70 2d 3e 70 57 43 3b 20 20 20 20 20 20 2f 2a 20  p->pWC;      /* 
13f20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
13f30 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
13f40 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20  List_item *pSrc 
13f50 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68  = p->pSrc; /* Th
13f60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
13f70 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
13f80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
13f90 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71  pSrc->pTab;.  sq
13fa0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13fb0 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
13fc0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13fd0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
13fe0 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
13ff0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14000 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
14010 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
14020 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
14030 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
14040 6e 4f 72 64 65 72 42 79 3b 0a 20 20 64 6f 75 62  nOrderBy;.  doub
14050 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f 2a 20  le rCost;..  /* 
14060 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c 61 67  Make sure wsFlag
14070 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  s is initialized
14080 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20 76 61   to some sane va
14090 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  lue. Otherwise, 
140a0 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 6c  if the .  ** mal
140b0 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74 65 49  loc in allocateI
140c0 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69 6c 73  ndexInfo() fails
140d0 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
140e0 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61 76 69  on returns leavi
140f0 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67 73 20  ng.  ** wsFlags 
14100 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  in an uninitiali
14110 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65 20 63  zed state, the c
14120 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61 76 65  aller may behave
14130 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79 2e 0a   unpredictably..
14140 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70    */.  memset(&p
14150 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f  ->cost, 0, sizeo
14160 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a 20 20 70  f(p->cost));.  p
14170 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  ->cost.plan.wsFl
14180 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
14190 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20  UALTABLE;..  /* 
141a0 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  If the sqlite3_i
141b0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
141c0 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ure has not been
141d0 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a   previously.  **
141e0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
141f0 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e  nitialized, then
14200 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   allocate and in
14210 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77 2e  itialize it now.
14220 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
14230 20 3d 20 2a 70 2d 3e 70 70 49 64 78 49 6e 66 6f   = *p->ppIdxInfo
14240 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
14250 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 2d 3e 70  ==0 ){.    *p->p
14260 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78 49  pIdxInfo = pIdxI
14270 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
14280 64 65 78 49 6e 66 6f 28 70 29 3b 0a 20 20 7d 0a  dexInfo(p);.  }.
14290 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
142a0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
142b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
142c0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71  is point, the sq
142d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
142e0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
142f0 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a  pIdxInfo points.
14300 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76    ** to will hav
14310 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  e been initializ
14320 65 64 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e  ed, either durin
14330 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  g the current in
14340 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a  vocation or.  **
14350 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69   during some pri
14360 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20  or invocation.  
14370 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76 65  Now we just have
14380 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68   to customize th
14390 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f  e.  ** details o
143a0 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74  f pIdxInfo for t
143b0 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63  he current invoc
143c0 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69  ation and pass i
143d0 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49  t to.  ** xBestI
143e0 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  ndex..  */..  /*
143f0 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65   The module name
14400 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
14410 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20  . Also, by this 
14420 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74  point there must
14430 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74  .  ** be a point
14440 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
14450 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e  _vtab structure.
14460 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20   Otherwise.  ** 
14470 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
14480 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c  lumnNames() woul
14490 64 20 68 61 76 65 20 70 69 63 6b 65 64 20 75 70  d have picked up
144a0 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a   the error. .  *
144b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
144c0 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26  ->azModuleArg &&
144d0 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
144e0 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72  rg[0] );.  asser
144f0 74 28 20 73 71 6c 69 74 65 33 47 65 74 56 54 61  t( sqlite3GetVTa
14500 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
14510 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a 20 53  pTab) );..  /* S
14520 65 74 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69  et the aConstrai
14530 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c  nt[].usable fiel
14540 64 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ds and initializ
14550 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74 70  e all .  ** outp
14560 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ut variables to 
14570 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
14580 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73  aConstraint[].us
14590 61 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f 72  able is true for
145a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68 65   constraints whe
145b0 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
145c0 64 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74  d.  ** side cont
145d0 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72 65  ains only refere
145e0 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 73 20 74  nces to tables t
145f0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
14600 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 74  e current.  ** t
14610 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  able.  In other 
14620 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 63 6f  words, if the co
14630 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74  nstraint is of t
14640 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
14650 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  **           col
14660 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a 0a  umn = expr.  **.
14670 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20    ** and we are 
14680 65 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69  evaluating a joi
14690 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  n, then the cons
146a0 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e  traint on column
146b0 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76   is .  ** only v
146c0 61 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c  alid if all tabl
146d0 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e  es referenced in
146e0 20 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74   expr occur to t
146f0 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20  he left.  ** of 
14700 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  the table contai
14710 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a  ning column..  *
14720 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73  *.  ** The aCons
14730 74 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 20  traints[] array 
14740 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
14750 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61   for all constra
14760 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ints.  ** on the
14770 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20   current table. 
14780 20 54 68 61 74 20 77 61 79 20 77 65 20 6f 6e 6c   That way we onl
14790 79 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74  y have to comput
147a0 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 65  e it once.  ** e
147b0 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20 6d 69  ven though we mi
147c0 67 68 74 20 74 72 79 20 74 6f 20 70 69 63 6b 20  ght try to pick 
147d0 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 6d  the best index m
147e0 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20  ultiple times.. 
147f0 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 61 74 74   ** For each att
14800 65 6d 70 74 20 61 74 20 70 69 63 6b 69 6e 67 20  empt at picking 
14810 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72  an index, the or
14820 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  der of tables in
14830 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d   the.  ** join m
14840 69 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e  ight be differen
14850 74 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  t so we have to 
14860 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73  recompute the us
14870 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20 65  able flag.  ** e
14880 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ach time..  */. 
14890 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
148a0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
148b0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
148c0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
148d0 74 72 61 69 6e 74 3b 0a 20 20 70 55 73 61 67 65  traint;.  pUsage
148e0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
148f0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
14900 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
14910 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
14920 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
14930 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49 64  ++){.    j = pId
14940 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
14950 65 74 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  et;.    pTerm = 
14960 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
14970 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
14980 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65   = (pTerm->prere
14990 71 52 69 67 68 74 26 70 2d 3e 6e 6f 74 52 65 61  qRight&p->notRea
149a0 64 79 29 20 3f 20 30 20 3a 20 31 3b 0a 20 20 7d  dy) ? 0 : 1;.  }
149b0 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65  .  memset(pUsage
149c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
149d0 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
149e0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
149f0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
14a00 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
14a10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
14a20 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
14a30 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64  xStr);.  }.  pId
14a40 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
14a50 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  0;.  pIdxInfo->i
14a60 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64  dxNum = 0;.  pId
14a70 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
14a80 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  eIdxStr = 0;.  p
14a90 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
14aa0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
14ab0 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49  /* ((double)2) I
14ac0 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45  n case of SQLITE
14ad0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
14ae0 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 70 49 64  OINT... */.  pId
14af0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
14b00 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
14b10 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65  G_DBL / ((double
14b20 29 32 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  )2);.  nOrderBy 
14b30 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  = pIdxInfo->nOrd
14b40 65 72 42 79 3b 0a 20 20 69 66 28 20 21 70 2d 3e  erBy;.  if( !p->
14b50 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
14b60 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
14b70 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  By = 0;.  }..  i
14b80 66 28 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  f( vtabBestIndex
14b90 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
14ba0 49 64 78 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  IdxInfo) ){.    
14bb0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70  return;.  }..  p
14bc0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
14bd0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14be0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
14bf0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
14c00 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
14c10 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
14c20 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
14c30 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
14c40 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
14c50 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 75  .      p->cost.u
14c60 73 65 64 20 7c 3d 20 70 57 43 2d 3e 61 5b 70 49  sed |= pWC->a[pI
14c70 64 78 43 6f 6e 73 5b 69 5d 2e 69 54 65 72 6d 4f  dxCons[i].iTermO
14c80 66 66 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67  ffset].prereqRig
14c90 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ht;.    }.  }.. 
14ca0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
14cb0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
14cc0 73 65 2c 20 61 6e 64 20 74 68 65 20 73 65 6c 65  se, and the sele
14cd0 63 74 65 64 20 76 69 72 74 75 61 6c 20 74 61 62  cted virtual tab
14ce0 6c 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 64 6f  le index.  ** do
14cf0 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 69  es not satisfy i
14d00 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  t, increase the 
14d10 63 6f 73 74 20 6f 66 20 74 68 65 20 73 63 61 6e  cost of the scan
14d20 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68   accordingly. Th
14d30 69 73 0a 20 20 2a 2a 20 6d 61 74 63 68 65 73 20  is.  ** matches 
14d40 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66  the processing f
14d50 6f 72 20 6e 6f 6e 2d 76 69 72 74 75 61 6c 20 74  or non-virtual t
14d60 61 62 6c 65 73 20 69 6e 20 62 65 73 74 42 74 72  ables in bestBtr
14d70 65 65 49 6e 64 65 78 28 29 2e 0a 20 20 2a 2f 0a  eeIndex()..  */.
14d80 20 20 72 43 6f 73 74 20 3d 20 70 49 64 78 49 6e    rCost = pIdxIn
14d90 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
14da0 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  t;.  if( p->pOrd
14db0 65 72 42 79 20 26 26 20 70 49 64 78 49 6e 66 6f  erBy && pIdxInfo
14dc0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
14dd0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43 6f 73  d==0 ){.    rCos
14de0 74 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43 6f 73  t += estLog(rCos
14df0 74 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a 0a 20  t)*rCost;.  }.. 
14e00 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20   /* The cost is 
14e10 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  not allowed to b
14e20 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51  e larger than SQ
14e30 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68  LITE_BIG_DBL (th
14e40 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61  e.  ** inital va
14e50 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73  lue of lowestCos
14e60 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20  t in this loop. 
14e70 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  If it is, then t
14e80 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c 6c 6f  he.  ** (cost<lo
14e90 77 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62  westCost) test b
14ea0 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20  elow will never 
14eb0 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20 0a 20  be true..  ** . 
14ec0 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62 6c 65   ** Use "(double
14ed0 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  )2" instead of "
14ee0 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f 4d 49  2.0" in case OMI
14ef0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
14f00 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69 6e 65   .  ** is define
14f10 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 53  d..  */.  if( (S
14f20 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28  QLITE_BIG_DBL/((
14f30 64 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f 73 74  double)2))<rCost
14f40 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e   ){.    p->cost.
14f50 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f  rCost = (SQLITE_
14f60 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65  BIG_DBL/((double
14f70 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )2));.  }else{. 
14f80 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74     p->cost.rCost
14f90 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d 0a 20 20   = rCost;.  }.  
14fa0 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70  p->cost.plan.u.p
14fb0 56 74 61 62 49 64 78 20 3d 20 70 49 64 78 49 6e  VtabIdx = pIdxIn
14fc0 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
14fd0 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
14fe0 6d 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f  med ){.    p->co
14ff0 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
15000 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  |= WHERE_ORDERBY
15010 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 73 74 2e  ;.  }.  p->cost.
15020 70 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  plan.nEq = 0;.  
15030 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
15040 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a  By = nOrderBy;..
15050 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
15060 20 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e   a more efficien
15070 74 20 61 63 63 65 73 73 20 70 61 74 74 65 72 6e  t access pattern
15080 20 62 79 20 75 73 69 6e 67 20 6d 75 6c 74 69 70   by using multip
15090 6c 65 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20  le indexes.  ** 
150a0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f  to optimize an O
150b0 52 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  R expression wit
150c0 68 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c  hin the WHERE cl
150d0 61 75 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65  ause. .  */.  be
150e0 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
150f0 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  p);.}.#endif /* 
15100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
15110 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
15120 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15130 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73  E_STAT3./*.** Es
15140 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74  timate the locat
15150 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75  ion of a particu
15160 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c  lar key among al
15170 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20  l keys in an.** 
15180 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68  index.  Store th
15190 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74  e results in aSt
151a0 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  at as follows:.*
151b0 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d  *.**    aStat[0]
151c0 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
151d0 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74  r of rows less t
151e0 68 61 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61  han pVal.**    a
151f0 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74  Stat[1]      Est
15200 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
15210 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a   equal to pVal.*
15220 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
15230 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
15240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15250 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20  whereKeyStats(. 
15260 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15280 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
15290 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
152a0 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
152b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
152c0 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
152d0 20 6f 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   of */.  sqlite3
152e0 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20  _value *pVal,   
152f0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
15300 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
15310 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20  nt roundUp,     
15320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
15330 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20  und up if true. 
15340 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66   Round down if f
15350 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  alse */.  tRowcn
15360 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20  t *aStat        
15370 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74        /* OUT: st
15380 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65  ats written here
15390 20 2a 2f 0a 29 7b 0a 20 20 74 52 6f 77 63 6e 74   */.){.  tRowcnt
153a0 20 6e 3b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c   n;.  IndexSampl
153b0 65 20 2a 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e  e *aSample;.  in
153c0 74 20 69 2c 20 65 54 79 70 65 3b 0a 20 20 69 6e  t i, eType;.  in
153d0 74 20 69 73 45 71 20 3d 20 30 3b 0a 20 20 69 36  t isEq = 0;.  i6
153e0 34 20 76 3b 0a 20 20 64 6f 75 62 6c 65 20 72 2c  4 v;.  double r,
153f0 20 72 53 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rS;..  assert( 
15400 72 6f 75 6e 64 55 70 3d 3d 30 20 7c 7c 20 72 6f  roundUp==0 || ro
15410 75 6e 64 55 70 3d 3d 31 20 29 3b 0a 20 20 61 73  undUp==1 );.  as
15420 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
15430 70 6c 65 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ple>0 );.  if( p
15440 56 61 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Val==0 ) return 
15450 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15460 6e 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45  n = pIdx->aiRowE
15470 73 74 5b 30 5d 3b 0a 20 20 61 53 61 6d 70 6c 65  st[0];.  aSample
15480 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65   = pIdx->aSample
15490 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69  ;.  eType = sqli
154a0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
154b0 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  Val);..  if( eTy
154c0 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  pe==SQLITE_INTEG
154d0 45 52 20 29 7b 0a 20 20 20 20 76 20 3d 20 73 71  ER ){.    v = sq
154e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
154f0 34 28 70 56 61 6c 29 3b 0a 20 20 20 20 72 20 3d  4(pVal);.    r =
15500 20 28 69 36 34 29 76 3b 0a 20 20 20 20 66 6f 72   (i64)v;.    for
15510 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53  (i=0; i<pIdx->nS
15520 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ample; i++){.   
15530 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
15540 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
15550 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
15560 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
15570 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c  le[i].eType>=SQL
15580 49 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b  ITE_TEXT ) break
15590 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d  ;.      if( aSam
155a0 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
155b0 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
155c0 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
155d0 70 6c 65 5b 69 5d 2e 75 2e 69 3e 3d 76 20 29 7b  ple[i].u.i>=v ){
155e0 0a 20 20 20 20 20 20 20 20 20 20 69 73 45 71 20  .          isEq 
155f0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69  = aSample[i].u.i
15600 3d 3d 76 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==v;.          b
15610 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
15620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15630 20 20 20 20 20 61 73 73 65 72 74 28 20 61 53 61       assert( aSa
15640 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
15650 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 3b 0a 20  QLITE_FLOAT );. 
15660 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
15670 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72 20 29 7b 0a  le[i].u.r>=r ){.
15680 20 20 20 20 20 20 20 20 20 20 69 73 45 71 20 3d            isEq =
15690 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3d   aSample[i].u.r=
156a0 3d 72 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  =r;.          br
156b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
156c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
156d0 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d  else if( eType==
156e0 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
156f0 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f      r = sqlite3_
15700 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61  value_double(pVa
15710 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l);.    for(i=0;
15720 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
15730 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
15740 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
15750 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  pe==SQLITE_NULL 
15760 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15770 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
15780 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54  .eType>=SQLITE_T
15790 45 58 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  EXT ) break;.   
157a0 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
157b0 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
157c0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
157d0 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d   rS = aSample[i]
157e0 2e 75 2e 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  .u.r;.      }els
157f0 65 7b 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20  e{.        rS = 
15800 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3b 0a  aSample[i].u.i;.
15810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15820 28 20 72 53 3e 3d 72 20 29 7b 0a 20 20 20 20 20  ( rS>=r ){.     
15830 20 20 20 69 73 45 71 20 3d 20 72 53 3d 3d 72 3b     isEq = rS==r;
15840 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15860 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d  }else if( eType=
15870 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
15880 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 69      i = 0;.    i
15890 66 28 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 65 54  f( aSample[0].eT
158a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
158b0 20 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 7d   ) isEq = 1;.  }
158c0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
158d0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
158e0 54 45 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53  TEXT || eType==S
158f0 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 20 20  QLITE_BLOB );.  
15900 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
15910 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  x->nSample; i++)
15920 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d  {.      if( aSam
15930 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
15940 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 61 53 61  LITE_TEXT || aSa
15950 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
15960 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20  QLITE_BLOB ){.  
15970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15990 66 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  f( i<pIdx->nSamp
159a0 6c 65 20 29 7b 20 20 20 20 20 20 0a 20 20 20 20  le ){      .    
159b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
159c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
159d0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
159e0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  ;.      const u8
159f0 20 2a 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 65   *z;.      if( e
15a00 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
15a10 42 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d  B ){.        z =
15a20 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c   (const u8 *)sql
15a30 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
15a40 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70  pVal);.        p
15a50 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
15a60 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  Coll;.        as
15a70 73 65 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63  sert( pColl->enc
15a80 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b  ==SQLITE_UTF8 );
15a90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15aa0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
15ab0 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
15ac0 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
15ad0 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c   0, *pIdx->azCol
15ae0 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
15af0 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pColl==0 ){.    
15b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15b10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
15b20 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
15b30 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c 0a   sequence: %s",.
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 20 20 20 20 20 20 20 20 20 2a 70 49 64 78 2d            *pIdx-
15b60 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  >azColl);.      
15b70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15b80 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
15b90 20 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28   }.        z = (
15ba0 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74  const u8 *)sqlit
15bb0 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
15bc0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
15bd0 20 20 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b         if( !z ){
15be0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
15bf0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15c00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15c10 20 20 61 73 73 65 72 74 28 20 7a 20 26 26 20 70    assert( z && p
15c20 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78  Coll && pColl->x
15c30 43 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Cmp );.      }. 
15c40 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
15c50 56 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c  ValueBytes(pVal,
15c60 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
15c70 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3c 70  .      for(; i<p
15c80 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  Idx->nSample; i+
15c90 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
15ca0 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  c;.        int e
15cb0 53 61 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61  Sampletype = aSa
15cc0 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20  mple[i].eType;. 
15cd0 20 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70         if( eSamp
15ce0 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29 20 63  letype<eType ) c
15cf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
15d00 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65   if( eSampletype
15d10 21 3d 65 54 79 70 65 20 29 20 62 72 65 61 6b 3b  !=eType ) break;
15d20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15d30 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20  OMIT_UTF16.     
15d40 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e     if( pColl->en
15d50 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  c!=SQLITE_UTF8 )
15d60 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
15d70 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20  nSample;.       
15d80 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65     char *zSample
15d90 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74 6f   = sqlite3Utf8to
15da0 31 36 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  16(.            
15db0 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63    db, pColl->enc
15dc0 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a  , aSample[i].u.z
15dd0 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79  , aSample[i].nBy
15de0 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20  te, &nSample.   
15df0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
15e00 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c 65      if( !zSample
15e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15e20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
15e30 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
15e40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15e50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15e70 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43     c = pColl->xC
15e80 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
15e90 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c   nSample, zSampl
15ea0 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e, n, z);.      
15eb0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15ec0 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a  e(db, zSample);.
15ed0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
15ee0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
15ef0 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f           c = pCo
15f00 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
15f10 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69  pUser, aSample[i
15f20 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c 65  ].nByte, aSample
15f30 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a  [i].u.z, n, z);.
15f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15f50 20 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a 20 20    if( c>=0 ){.  
15f60 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
15f70 20 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 20   ) isEq = 1;.   
15f80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15fa0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15fb0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
15fc0 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65  Sample[i] is the
15fd0 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68   first sample th
15fe0 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
15ff0 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c  an.  ** or equal
16000 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66   to pVal.  Or if
16010 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
16020 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70  e, then all samp
16030 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a  les are less.  *
16040 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66  * than pVal.  If
16050 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61   aSample[i]==pVa
16060 6c 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d 31 2e  l, then isEq==1.
16070 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 71  .  */.  if( isEq
16080 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16090 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  i<pIdx->nSample 
160a0 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  );.    aStat[0] 
160b0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74  = aSample[i].nLt
160c0 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  ;.    aStat[1] =
160d0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b   aSample[i].nEq;
160e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52  .  }else{.    tR
160f0 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55  owcnt iLower, iU
16100 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20  pper, iGap;.    
16110 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
16120 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    iLower = 0;.  
16130 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61      iUpper = aSa
16140 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20  mple[0].nLt;.   
16150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55   }else{.      iU
16160 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e  pper = i>=pIdx->
16170 6e 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20 61 53  nSample ? n : aS
16180 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20  ample[i].nLt;.  
16190 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
161a0 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20  mple[i-1].nEq + 
161b0 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74  aSample[i-1].nLt
161c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61  ;.    }.    aSta
161d0 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76 67  t[1] = pIdx->avg
161e0 45 71 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77  Eq;.    if( iLow
161f0 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20  er>=iUpper ){.  
16200 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20      iGap = 0;.  
16210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
16220 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69  Gap = iUpper - i
16230 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Lower;.    }.   
16240 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
16250 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47        iGap = (iG
16260 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c  ap*2)/3;.    }el
16270 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
16280 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20   iGap/3;.    }. 
16290 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c     aStat[0] = iL
162a0 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d  ower + iGap;.  }
162b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
162c0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
162d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
162e0 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  TAT3 */../*.** I
162f0 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
16300 70 72 20 72 65 70 72 65 73 65 6e 74 73 20 61 20  pr represents a 
16310 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20 73  literal value, s
16320 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20  et *pp to point 
16330 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33  to.** an sqlite3
16340 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
16350 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
16360 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74 68  same value, with
16370 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66   affinity.** aff
16380 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20   applied to it, 
16390 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
163a0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
163b0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
163c0 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  e .** caller to 
163d0 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
163e0 73 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72  se this structur
163f0 65 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20  e by passing it 
16400 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61  to .** sqlite3Va
16410 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  lueFree()..**.**
16420 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
16430 70 61 72 73 65 20 69 73 20 61 20 72 65 63 6f 6d  parse is a recom
16440 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65 70  pile (sqlite3Rep
16450 72 65 70 61 72 65 28 29 29 20 61 6e 64 20 70 45  repare()) and pE
16460 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c  xpr.** is an SQL
16470 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 63   variable that c
16480 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20 6e  urrently has a n
16490 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f  on-NULL value bo
164a0 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72  und to it,.** cr
164b0 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  eate an sqlite3_
164c0 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
164d0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
164e0 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69 74  value, again wit
164f0 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61 66  h.** affinity af
16500 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c  f applied to it,
16510 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
16520 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68  If neither of th
16530 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20 73  e above apply, s
16540 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a  et *pp to NULL..
16550 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
16560 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
16570 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
16580 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
16590 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  E_OK..*/.#ifdef 
165a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
165b0 41 54 33 0a 73 74 61 74 69 63 20 69 6e 74 20 76  AT3.static int v
165c0 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20  alueFromExpr(.  
165d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
165e0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a    Expr *pExpr, .
165f0 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71 6c    u8 aff, .  sql
16600 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a  ite3_value **pp.
16610 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
16620 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a  op==TK_VARIABLE.
16630 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70     || (pExpr->op
16640 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
16650 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
16660 56 41 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20  VARIABLE).  ){. 
16670 20 20 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45     int iVar = pE
16680 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
16690 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
166a0 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
166b0 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20  pVdbe, iVar);.  
166c0 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56    *pp = sqlite3V
166d0 64 62 65 47 65 74 56 61 6c 75 65 28 70 50 61 72  dbeGetValue(pPar
166e0 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20  se->pReprepare, 
166f0 69 56 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20  iVar, aff);.    
16700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16710 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
16720 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45  qlite3ValueFromE
16730 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  xpr(pParse->db, 
16740 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54  pExpr, SQLITE_UT
16750 46 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a  F8, aff, pp);.}.
16760 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
16770 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
16780 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  sed to estimate 
16790 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
167a0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
167b0 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63  visited.** by sc
167c0 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  anning an index 
167d0 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76  for a range of v
167e0 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65  alues. The range
167f0 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70   may have an upp
16800 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c  er.** bound, a l
16810 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62  ower bound, or b
16820 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63  oth. The WHERE c
16830 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
16840 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a   set the upper.*
16850 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  * and lower boun
16860 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ds are represent
16870 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64  ed by pLower and
16880 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
16890 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61  vely. For.** exa
168a0 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  mple, assuming t
168b0 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f  hat index p is o
168c0 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20  n t1(a):.**.**  
168d0 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
168e0 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
168f0 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20   ? ....**       
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f               |__
16910 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a  ___|   |_____|.*
16920 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16930 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
16940 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
16950 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65             pLowe
16960 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a  r    pUpper.**.*
16970 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  * If either of t
16980 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65  he upper or lowe
16990 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70  r bound is not p
169a0 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c  resent, then NUL
169b0 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a  L is passed in.*
169c0 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63  * place of the c
169d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
169e0 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  reTerm..**.** Th
169f0 65 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20  e nEq parameter 
16a00 69 73 20 70 61 73 73 65 64 20 74 68 65 20 69 6e  is passed the in
16a10 64 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78  dex of the index
16a20 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20   column subject 
16a30 74 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20  to the.** range 
16a40 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20  constraint. Or, 
16a50 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68  equivalently, th
16a60 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61  e number of equa
16a70 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16a80 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79  .** optimized by
16a90 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e   the proposed in
16aa0 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78  dex scan. For ex
16ab0 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
16ac0 69 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e  index p is.** on
16ad0 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74   t1(a, b), and t
16ae0 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a  he SQL query is:
16af0 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
16b00 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f  M t1 WHERE a = ?
16b10 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62   AND b > ? AND b
16b20 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
16b30 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62  hen nEq should b
16b40 65 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c  e passed the val
16b50 75 65 20 31 20 28 61 73 20 74 68 65 20 72 61 6e  ue 1 (as the ran
16b60 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f  ge restricted co
16b70 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74  lumn,.** b, is t
16b80 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d  he second left-m
16b90 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
16ba0 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66  e index). Or, if
16bb0 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a   the query is:.*
16bc0 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
16bd0 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
16be0 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND a < ? ....**.
16bf0 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75  ** then nEq shou
16c00 6c 64 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a  ld be passed 0..
16c10 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
16c20 65 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  ed value is an i
16c30 6e 74 65 67 65 72 20 64 69 76 69 73 6f 72 20 74  nteger divisor t
16c40 6f 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74  o reduce the est
16c50 69 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72 63 68  imated.** search
16c60 20 73 70 61 63 65 2e 20 20 41 20 72 65 74 75 72   space.  A retur
16c70 6e 20 76 61 6c 75 65 20 6f 66 20 31 20 6d 65 61  n value of 1 mea
16c80 6e 73 20 74 68 61 74 20 72 61 6e 67 65 20 63 6f  ns that range co
16c90 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a  nstraints are.**
16ca0 20 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e   no help at all.
16cb0 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65    A return value
16cc0 20 6f 66 20 32 20 6d 65 61 6e 73 20 72 61 6e 67   of 2 means rang
16cd0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
16ce0 65 0a 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f  e.** expected to
16cf0 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
16d00 63 68 20 73 70 61 63 65 20 62 79 20 68 61 6c 66  ch space by half
16d10 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
16d20 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  ...**.** In the 
16d30 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74  absence of sqlit
16d40 65 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a 45 20  e_stat3 ANALYZE 
16d50 64 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65  data, each range
16d60 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72   inequality.** r
16d70 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
16d80 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63  h space by a fac
16d90 74 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e 63 65  tor of 4.  Hence
16da0 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   a single constr
16db0 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65  aint (x>?).** re
16dc0 73 75 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72  sults in a retur
16dd0 6e 20 6f 66 20 34 20 61 6e 64 20 61 20 72 61 6e  n of 4 and a ran
16de0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78  ge constraint (x
16df0 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75  >? AND x<?) resu
16e00 6c 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75  lts.** in a retu
16e10 72 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61  rn of 16..*/.sta
16e20 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
16e30 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
16e40 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
16e50 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
16e60 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
16e70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
16e80 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
16e90 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f   /* The index co
16ea0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e  ntaining the ran
16eb0 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75  ge-compared colu
16ec0 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74  mn; "x" */.  int
16ed0 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   nEq,           
16ee0 20 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20    /* index into 
16ef0 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65  p->aCol[] of the
16f00 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20   range-compared 
16f10 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
16f20 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
16f30 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
16f40 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
16f50 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
16f60 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
16f70 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
16f80 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
16f90 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
16fa0 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
16fb0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 64 6f   be NULL */.  do
16fc0 75 62 6c 65 20 2a 70 52 61 6e 67 65 44 69 76 20  uble *pRangeDiv 
16fd0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75 63 65    /* OUT: Reduce
16fe0 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
16ff0 20 74 68 69 73 20 64 69 76 69 73 6f 72 20 2a 2f   this divisor */
17000 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
17010 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
17020 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17030 53 54 41 54 33 0a 0a 20 20 69 66 28 20 6e 45 71  STAT3..  if( nEq
17040 3d 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c  ==0 && p->nSampl
17050 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
17060 5f 76 61 6c 75 65 20 2a 70 52 61 6e 67 65 56 61  _value *pRangeVa
17070 6c 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  l;.    tRowcnt i
17080 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 74  Lower = 0;.    t
17090 52 6f 77 63 6e 74 20 69 55 70 70 65 72 20 3d 20  Rowcnt iUpper = 
170a0 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  p->aiRowEst[0];.
170b0 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d      tRowcnt a[2]
170c0 3b 0a 20 20 20 20 75 38 20 61 66 66 20 3d 20 70  ;.    u8 aff = p
170d0 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
170e0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61  ->aiColumn[0]].a
170f0 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66  ffinity;..    if
17100 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
17110 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17120 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pLower->pExpr->p
17130 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20  Right;.      rc 
17140 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
17150 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
17160 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b  ff, &pRangeVal);
17170 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17180 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
17190 3d 3d 57 4f 5f 47 54 20 7c 7c 20 70 4c 6f 77 65  ==WO_GT || pLowe
171a0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  r->eOperator==WO
171b0 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _GE );.      if(
171c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
171d0 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b 65        && whereKe
171e0 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
171f0 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20  , pRangeVal, 0, 
17200 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  a)==SQLITE_OK.  
17210 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
17220 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20  Lower = a[0];.  
17230 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72        if( pLower
17240 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
17250 47 54 20 29 20 69 4c 6f 77 65 72 20 2b 3d 20 61  GT ) iLower += a
17260 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [1];.      }.   
17270 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
17280 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a  ree(pRangeVal);.
17290 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
172a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
172b0 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 45  Upper ){.      E
172c0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70  xpr *pExpr = pUp
172d0 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
172e0 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76  ht;.      rc = v
172f0 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
17300 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  rse, pExpr, aff,
17310 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20   &pRangeVal);.  
17320 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70      assert( pUpp
17330 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  er->eOperator==W
17340 4f 5f 4c 54 20 7c 7c 20 70 55 70 70 65 72 2d 3e  O_LT || pUpper->
17350 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 45  eOperator==WO_LE
17360 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
17370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
17380 20 20 20 26 26 20 77 68 65 72 65 4b 65 79 53 74     && whereKeySt
17390 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
173a0 52 61 6e 67 65 56 61 6c 2c 20 31 2c 20 61 29 3d  RangeVal, 1, a)=
173b0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
173c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 55 70 70   ){.        iUpp
173d0 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
173e0 20 20 20 69 66 28 20 70 55 70 70 65 72 2d 3e 65     if( pUpper->e
173f0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 45 20  Operator==WO_LE 
17400 29 20 69 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d  ) iUpper += a[1]
17410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17420 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
17430 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20  (pRangeVal);.   
17440 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
17450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17460 20 20 69 66 28 20 69 55 70 70 65 72 3c 3d 69 4c    if( iUpper<=iL
17470 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
17480 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f  *pRangeDiv = (do
17490 75 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74  uble)p->aiRowEst
174a0 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [0];.      }else
174b0 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67  {.        *pRang
174c0 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 70  eDiv = (double)p
174d0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f 28 64  ->aiRowEst[0]/(d
174e0 6f 75 62 6c 65 29 28 69 55 70 70 65 72 20 2d 20  ouble)(iUpper - 
174f0 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d  iLower);.      }
17500 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
17510 45 28 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72  E(("range scan r
17520 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20  egions: %u..%u  
17530 64 69 76 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20  div=%g\n",.     
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
17550 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
17560 55 70 70 65 72 2c 20 2a 70 52 61 6e 67 65 44 69  Upper, *pRangeDi
17570 76 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  v));.      retur
17580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
17590 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
175a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
175b0 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45  pParse);.  UNUSE
175c0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
175d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
175e0 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a  ER(nEq);.#endif.
175f0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
17600 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20   || pUpper );.  
17610 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f  *pRangeDiv = (do
17620 75 62 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 4c  uble)1;.  if( pL
17630 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d  ower && (pLower-
17640 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
17650 56 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70 52 61  VNULL)==0 ) *pRa
17660 6e 67 65 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c  ngeDiv *= (doubl
17670 65 29 34 3b 0a 20 20 69 66 28 20 70 55 70 70 65  e)4;.  if( pUppe
17680 72 20 29 20 2a 70 52 61 6e 67 65 44 69 76 20 2a  r ) *pRangeDiv *
17690 3d 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20 72  = (double)4;.  r
176a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
176b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
176c0 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73  E_STAT3./*.** Es
176d0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
176e0 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
176f0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
17700 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
17710 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
17720 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
17730 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
17740 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
17750 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
17760 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
17770 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
17780 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
17790 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
177a0 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
177b0 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
177c0 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
177d0 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
177e0 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
177f0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
17800 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
17810 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
17820 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
17830 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
17840 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
17850 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
17860 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
17870 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
17880 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
17890 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
178a0 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
178b0 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
178c0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
178d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
178e0 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
178f0 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
17900 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
17910 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
17920 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
17930 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
17940 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
17950 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
17960 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
17970 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
17980 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
17990 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
179a0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
179b0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
179c0 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
179d0 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
179e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
179f0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
17a00 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
17a10 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
17a20 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
17a30 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
17a40 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  ose left-most co
17a50 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f  lumn is pTerm */
17a60 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
17a70 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
17a80 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
17a90 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
17aa0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 64  onstraint */.  d
17ab0 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20  ouble *pnRow    
17ac0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
17ad0 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
17ae0 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
17af0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
17b00 20 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20   *pRhs = 0;  /* 
17b10 56 41 4c 55 45 20 6f 6e 20 72 69 67 68 74 2d 68  VALUE on right-h
17b20 61 6e 64 20 73 69 64 65 20 6f 66 20 70 54 65 72  and side of pTer
17b30 6d 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20 20  m */.  u8 aff;  
17b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b50 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e   /* Column affin
17b60 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ity */.  int rc;
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b80 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
17b90 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
17ba0 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17bc0 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20  Statistics */.. 
17bd0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
17be0 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ple!=0 );.  asse
17bf0 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  rt( p->nSample>0
17c00 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   );.  aff = p->p
17c10 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
17c20 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69  iColumn[0]].affi
17c30 6e 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70  nity;.  if( pExp
17c40 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61  r ){.    rc = va
17c50 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
17c60 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  se, pExpr, aff, 
17c70 26 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20  &pRhs);.    if( 
17c80 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45  rc ) goto whereE
17c90 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
17ca0 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  el;.  }else{.   
17cb0 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56   pRhs = sqlite3V
17cc0 61 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e  alueNew(pParse->
17cd0 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  db);.  }.  if( p
17ce0 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Rhs==0 ) return 
17cf0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
17d00 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4b 65 79  .  rc = whereKey
17d10 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
17d20 20 70 52 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20   pRhs, 0, a);.  
17d30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17d40 4b 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52  K ){.    WHERETR
17d50 41 43 45 28 28 22 65 71 75 61 6c 69 74 79 20 73  ACE(("equality s
17d60 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c  can regions: %d\
17d70 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b  n", (int)a[1]));
17d80 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b  .    *pnRow = a[
17d90 31 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71 75  1];.  }.whereEqu
17da0 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c  alScanEst_cancel
17db0 3a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  :.  sqlite3Value
17dc0 46 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65  Free(pRhs);.  re
17dd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
17de0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
17df0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
17e00 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
17e10 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
17e20 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
17e30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
17e40 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
17e50 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
17e60 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
17e70 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
17e80 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
17e90 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
17ea0 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
17eb0 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
17ec0 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
17ed0 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
17ee0 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
17ef0 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
17f00 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
17f10 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
17f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
17f30 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
17f40 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
17f50 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
17f60 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
17f70 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
17f80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17f90 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
17fa0 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
17fb0 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
17fc0 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
17fd0 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
17fe0 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
17ff0 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
18000 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
18010 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
18020 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
18030 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
18040 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
18050 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
18060 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
18070 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
18080 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
18090 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
180a0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
180b0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
180c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
180d0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
180e0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
180f0 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  ose left-most co
18100 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f  lumn is pTerm */
18110 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
18120 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76  st,     /* The v
18130 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65  alue list on the
18140 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76   RHS of "x IN (v
18150 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f  1,v2,v3,...)" */
18160 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77  .  double *pnRow
18170 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18180 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
18190 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
181a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
181b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
181c0 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
181d0 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
181e0 0a 20 20 64 6f 75 62 6c 65 20 6e 45 73 74 3b 20  .  double nEst; 
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18200 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
18210 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
18220 72 6d 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e  rm */.  double n
18230 52 6f 77 45 73 74 20 3d 20 28 64 6f 75 62 6c 65  RowEst = (double
18240 29 30 3b 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d  )0; /* New estim
18250 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
18260 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69  r of rows */.  i
18270 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
18280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
18290 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
182a0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
182b0 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
182c0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
182d0 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
182e0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
182f0 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45  nEst = p->aiRowE
18300 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20  st[0];.    rc = 
18310 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
18320 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 69  t(pParse, p, pLi
18330 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
18340 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77  &nEst);.    nRow
18350 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d  Est += nEst;.  }
18360 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
18380 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52  nRowEst > p->aiR
18390 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45  owEst[0] ) nRowE
183a0 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  st = p->aiRowEst
183b0 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  [0];.    *pnRow 
183c0 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
183d0 48 45 52 45 54 52 41 43 45 28 28 22 49 4e 20 72  HERETRACE(("IN r
183e0 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74  ow estimate: est
183f0 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29  =%g\n", nRowEst)
18400 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18410 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
18420 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
18430 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a  NABLE_STAT3) */.
18440 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
18450 73 65 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 43  see if column iC
18460 6f 6c 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ol of the table 
18470 77 69 74 68 20 63 75 72 73 6f 72 20 69 54 61 62  with cursor iTab
18480 20 77 69 6c 6c 20 61 70 70 65 61 72 0a 2a 2a 20   will appear.** 
18490 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20  in sorted order 
184a0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
184b0 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 20 70   current query p
184c0 6c 61 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75  lan.  Return tru
184d0 65 20 69 66 0a 2a 2a 20 69 74 20 77 69 6c 6c 20  e if.** it will 
184e0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
184f0 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 62  .  .**.** If *pb
18500 52 65 76 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  Rev is initially
18510 20 32 20 28 6d 65 61 6e 69 6e 67 20 22 75 6e 6b   2 (meaning "unk
18520 6e 6f 77 6e 22 29 20 74 68 65 6e 20 73 65 74 20  nown") then set 
18530 2a 70 62 52 65 76 20 74 6f 20 74 68 65 0a 2a 2a  *pbRev to the.**
18540 20 73 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 69   sort order of i
18550 54 61 62 2e 69 43 6f 6c 2e 20 20 49 66 20 2a 70  Tab.iCol.  If *p
18560 62 52 65 76 20 69 73 20 30 20 6f 72 20 31 20 62  bRev is 0 or 1 b
18570 75 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ut does not matc
18580 68 0a 2a 2a 20 74 68 65 20 73 6f 72 74 20 6f 72  h.** the sort or
18590 64 65 72 20 6f 66 20 69 54 61 62 2e 69 43 6f 6c  der of iTab.iCol
185a0 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20  , then consider 
185b0 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  the column to be
185c0 20 75 6e 6f 72 64 65 72 65 64 2e 0a 2a 2f 0a 73   unordered..*/.s
185d0 74 61 74 69 63 20 69 6e 74 20 69 73 4f 72 64 65  tatic int isOrde
185e0 72 65 64 43 6f 6c 75 6d 6e 28 57 68 65 72 65 42  redColumn(WhereB
185f0 65 73 74 49 64 78 20 2a 70 2c 20 69 6e 74 20 69  estIdx *p, int i
18600 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69  Tab, int iCol, i
18610 6e 74 20 2a 70 62 52 65 76 29 7b 0a 20 20 69 6e  nt *pbRev){.  in
18620 74 20 69 2c 20 6a 3b 0a 20 20 57 68 65 72 65 4c  t i, j;.  WhereL
18630 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26  evel *pLevel = &
18640 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31  p->aLevel[p->i-1
18650 5d 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ];.  Index *pIdx
18660 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72  ;.  u8 sortOrder
18670 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 69 2d 31  ;.  for(i=p->i-1
18680 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4c 65  ; i>=0; i--, pLe
18690 76 65 6c 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  vel--){.    if( 
186a0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 21  pLevel->iTabCur!
186b0 3d 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  =iTab ) continue
186c0 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  ;.    if( (pLeve
186d0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
186e0 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51  & WHERE_ALL_UNIQ
186f0 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  UE)!=0 ){.      
18700 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
18710 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
18720 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
18730 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
18740 30 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  0 ){.      pIdx 
18750 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
18760 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 69 66 28  .pIdx;.      if(
18770 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
18780 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30     sortOrder = 0
18790 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
187a0 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  se( (pLevel->pla
187b0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
187c0 45 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29 3b  E_REVERSE)!=0 );
187d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
187e0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
187f0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
18800 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
18810 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
18820 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 20 62 72  aiColumn[j] ) br
18830 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
18840 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 49         if( j>=pI
18850 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 72 65  dx->nColumn ) re
18860 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
18870 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78  sortOrder = pIdx
18880 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
18890 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
188a0 65 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  e( (pLevel->plan
188b0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
188c0 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29 3b 0a  _REVERSE)!=0 );.
188d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
188e0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  e{.      if( iCo
188f0 6c 21 3d 28 2d 31 29 20 29 20 72 65 74 75 72 6e  l!=(-1) ) return
18900 20 30 3b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72   0;.      sortOr
18910 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 74  der = 0;.      t
18920 65 73 74 63 61 73 65 28 20 28 70 4c 65 76 65 6c  estcase( (pLevel
18930 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
18940 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21   WHERE_REVERSE)!
18950 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
18960 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
18970 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
18980 45 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29 7b  E_REVERSE)!=0 ){
18990 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
189a0 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 73  ortOrder==0 || s
189b0 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20  ortOrder==1 );. 
189c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
189d0 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20  ortOrder==1 );. 
189e0 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d       sortOrder =
189f0 20 31 20 2d 20 73 6f 72 74 4f 72 64 65 72 3b 0a   1 - sortOrder;.
18a00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70      }.    if( *p
18a10 62 52 65 76 3d 3d 32 20 29 7b 0a 20 20 20 20 20  bRev==2 ){.     
18a20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72   *pbRev = sortOr
18a30 64 65 72 3b 0a 20 20 20 20 20 20 72 65 74 75 72  der;.      retur
18a40 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
18a50 65 74 75 72 6e 20 28 2a 70 62 52 65 76 3d 3d 73  eturn (*pbRev==s
18a60 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d 0a 20  ortOrder);.  }. 
18a70 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
18a80 0a 2a 2a 20 70 54 65 72 6d 20 69 73 20 61 6e 20  .** pTerm is an 
18a90 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  == constraint.  
18aa0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
18ab0 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20 6f  the other side o
18ac0 66 0a 2a 2a 20 74 68 65 20 3d 3d 20 69 73 20 61  f.** the == is a
18ad0 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 61 20 76   constant or a v
18ae0 61 6c 75 65 20 74 68 61 74 20 69 73 20 67 75 61  alue that is gua
18af0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6f 72  ranteed to be or
18b00 64 65 72 65 64 0a 2a 2a 20 62 79 20 6f 75 74 65  dered.** by oute
18b10 72 20 6c 6f 6f 70 73 2e 20 20 52 65 74 75 72 6e  r loops.  Return
18b20 20 31 20 69 66 20 70 54 65 72 6d 20 69 73 20 6f   1 if pTerm is o
18b30 72 64 65 72 65 64 2c 20 61 6e 64 20 30 20 69 66  rdered, and 0 if
18b40 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
18b50 69 6e 74 20 69 73 4f 72 64 65 72 65 64 54 65 72  int isOrderedTer
18b60 6d 28 57 68 65 72 65 42 65 73 74 49 64 78 20 2a  m(WhereBestIdx *
18b70 70 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  p, WhereTerm *pT
18b80 65 72 6d 2c 20 69 6e 74 20 2a 70 62 52 65 76 29  erm, int *pbRev)
18b90 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  {.  Expr *pExpr 
18ba0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
18bb0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
18bc0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20  >op==TK_EQ );.  
18bd0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
18be0 4c 65 66 74 21 3d 30 20 26 26 20 70 45 78 70 72  Left!=0 && pExpr
18bf0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
18c00 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65  COLUMN );.  asse
18c10 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
18c20 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  t!=0 );.  if( pT
18c30 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
18c40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
18c50 6e 20 31 3b 20 20 2f 2a 20 52 48 53 20 6f 66 20  n 1;  /* RHS of 
18c60 74 68 65 20 3d 3d 20 69 73 20 61 20 63 6f 6e 73  the == is a cons
18c70 74 61 6e 74 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  tant */.  }.  if
18c80 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d  ( pExpr->pRight-
18c90 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a  >op==TK_COLUMN .
18ca0 20 20 20 26 26 20 69 73 4f 72 64 65 72 65 64 43     && isOrderedC
18cb0 6f 6c 75 6d 6e 28 70 2c 20 70 45 78 70 72 2d 3e  olumn(p, pExpr->
18cc0 70 52 69 67 68 74 2d 3e 69 54 61 62 6c 65 2c 20  pRight->iTable, 
18cd0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 69  pExpr->pRight->i
18ce0 43 6f 6c 75 6d 6e 2c 20 70 62 52 65 76 29 0a 20  Column, pbRev). 
18cf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
18d00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
18d10 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74  e cannot prove t
18d20 68 61 74 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hat the constrai
18d30 6e 74 20 69 73 20 6f 72 64 65 72 65 64 2c 20 61  nt is ordered, a
18d40 73 73 75 6d 65 20 69 74 20 69 73 20 6e 6f 74 20  ssume it is not 
18d50 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
18d60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
18d70 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66 20  tine decides if 
18d80 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65 64  pIdx can be used
18d90 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
18da0 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75  ORDER BY.** clau
18db0 73 65 2c 20 65 69 74 68 65 72 20 69 6e 20 77 68  se, either in wh
18dc0 6f 6c 65 20 6f 72 20 69 6e 20 70 61 72 74 2e 20  ole or in part. 
18dd0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
18de0 65 20 69 73 20 74 68 65 20 0a 2a 2a 20 63 75 6d  e is the .** cum
18df0 75 6c 61 74 69 76 65 20 6e 75 6d 62 65 72 20 6f  ulative number o
18e00 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
18e10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
18e20 68 61 74 20 61 72 65 20 73 61 74 69 73 66 69 65  hat are satisfie
18e30 64 0a 2a 2a 20 62 79 20 74 68 65 20 69 6e 64 65  d.** by the inde
18e40 78 20 70 49 64 78 20 61 6e 64 20 6f 74 68 65 72  x pIdx and other
18e50 20 69 6e 64 69 63 65 73 20 69 6e 20 6f 75 74 65   indices in oute
18e60 72 20 6c 6f 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 54  r loops..**.** T
18e70 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71  he table being q
18e80 75 65 72 69 65 64 20 68 61 73 20 61 20 63 75 72  ueried has a cur
18e90 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62  sor number of "b
18ea0 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20 74  ase".  pIdx is t
18eb0 68 65 0a 2a 2a 20 69 6e 64 65 78 20 74 68 61 74  he.** index that
18ec0 20 69 73 20 70 6f 73 74 75 6c 61 74 65 64 20 66   is postulated f
18ed0 6f 72 20 75 73 65 20 74 6f 20 61 63 63 65 73 73  or use to access
18ee0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
18ef0 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20  * nEqCol is the 
18f00 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
18f10 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20 61  s of pIdx that a
18f20 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61 6c  re used as equal
18f30 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
18f40 74 73 20 61 6e 64 20 77 68 65 72 65 20 74 68 65  ts and where the
18f50 20 6f 74 68 65 72 20 73 69 64 65 20 6f 66 20 74   other side of t
18f60 68 65 20 3d 3d 20 69 73 20 61 6e 20 6f 72 64 65  he == is an orde
18f70 72 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 72  red column.** or
18f80 20 63 6f 6e 73 74 61 6e 74 2e 20 20 41 6e 20 22   constant.  An "
18f90 6f 72 64 65 72 20 63 6f 6c 75 6d 6e 22 20 69 6e  order column" in
18fa0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
18fb0 6e 74 65 6e 63 65 20 6d 65 61 6e 73 20 61 20 63  ntence means a c
18fc0 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 61 62 6c  olumn.** in tabl
18fd0 65 20 66 72 6f 6d 20 61 6e 20 6f 75 74 65 72 20  e from an outer 
18fe0 6c 6f 6f 70 20 77 68 6f 73 65 20 76 61 6c 75 65  loop whose value
18ff0 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 61 70  s will always ap
19000 70 65 61 72 20 69 6e 20 74 68 65 20 0a 2a 2a 20  pear in the .** 
19010 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 64 75  correct order du
19020 65 20 74 6f 20 6f 74 68 72 65 20 69 6e 64 65 78  e to othre index
19030 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  , or because the
19040 20 6f 75 74 65 72 20 6c 6f 6f 70 20 67 65 6e 65   outer loop gene
19050 72 61 74 65 73 0a 2a 2a 20 61 20 75 6e 69 71 75  rates.** a uniqu
19060 65 20 72 65 73 75 6c 74 2e 20 20 41 6e 79 20 6f  e result.  Any o
19070 66 20 74 68 65 20 66 69 72 73 74 20 6e 45 71 43  f the first nEqC
19080 6f 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49  ol columns of pI
19090 64 78 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e  dx may be missin
190a0 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 4f 52  g.** from the OR
190b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
190c0 64 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20  d the match can 
190d0 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65  still be a succe
190e0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 2a 70  ss..**.** The *p
190f0 62 52 65 76 20 76 61 6c 75 65 20 69 73 20 73 65  bRev value is se
19100 74 20 74 6f 20 30 20 6f 72 64 65 72 20 31 20 64  t to 0 order 1 d
19110 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
19120 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 70 49  her or not.** pI
19130 64 78 20 73 68 6f 75 6c 64 20 62 65 20 72 75 6e  dx should be run
19140 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20   in the forward 
19150 6f 72 64 65 72 20 6f 72 20 69 6e 20 72 65 76 65  order or in reve
19160 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  rse order..*/.st
19170 61 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69  atic int isSorti
19180 6e 67 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  ngIndex(.  Where
19190 42 65 73 74 49 64 78 20 2a 70 2c 20 20 20 20 2f  BestIdx *p,    /
191a0 2a 20 42 65 73 74 20 69 6e 64 65 78 20 73 65 61  * Best index sea
191b0 72 63 68 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rch context */. 
191c0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
191d0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
191e0 78 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67  x we are testing
191f0 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20   */.  int base, 
19200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
19210 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
19220 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73  he table to be s
19230 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  orted */.  int n
19240 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f  EqCol,         /
19250 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  * Number of inde
19260 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 6f  x columns with o
19270 72 64 65 72 65 64 20 3d 3d 20 63 6f 6e 73 74 72  rdered == constr
19280 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 77  aints */.  int w
19290 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 2f  sFlags,        /
192a0 2a 20 49 6e 64 65 78 20 75 73 61 67 65 73 20 66  * Index usages f
192b0 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  lags */.  int bO
192c0 75 74 65 72 52 65 76 2c 20 20 20 20 20 20 2f 2a  uterRev,      /*
192d0 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 6c   True if outer l
192e0 6f 6f 70 73 20 73 63 61 6e 20 69 6e 20 72 65 76  oops scan in rev
192f0 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
19300 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
19310 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
19320 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65  for reverse-orde
19330 72 20 73 63 61 6e 20 6f 66 20 70 49 64 78 20 2a  r scan of pIdx *
19340 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19370 66 20 70 49 64 78 20 74 65 72 6d 73 20 75 73 65  f pIdx terms use
19380 64 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  d */.  int j;   
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
193b0 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
193c0 20 73 61 74 69 73 66 69 65 64 20 2a 2f 0a 20 20   satisfied */.  
193d0 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20  int sortOrder = 
193e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
193f0 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
19400 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
19410 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
19420 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19440 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
19450 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74  BY terms */.  st
19460 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
19470 65 6d 20 2a 70 54 65 72 6d 3b 20 20 2f 2a 20 41  em *pTerm;  /* A
19480 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
19490 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
194a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
194b0 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
194c0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
194d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 50 61 72 73  clause */.  Pars
194e0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
194f0 50 61 72 73 65 3b 20 20 20 20 2f 2a 20 50 61 72  Parse;    /* Par
19500 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
19510 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
19520 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
19530 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
19540 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
19550 50 72 69 6f 72 53 61 74 3b 20 20 20 20 20 20 20  PriorSat;       
19560 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
19570 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
19580 66 69 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f  fied by outer lo
19590 6f 70 73 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  ops */.  int see
195a0 6e 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20  nRowid = 0;     
195b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
195c0 66 20 61 6e 20 4f 52 44 45 52 20 42 59 20 72 6f  f an ORDER BY ro
195d0 77 69 64 20 74 65 72 6d 20 69 73 20 73 65 65 6e  wid term is seen
195e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 4f 6e 65   */.  int nEqOne
195f0 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
19600 20 20 20 20 2f 2a 20 49 64 78 20 63 6f 6c 75 6d      /* Idx colum
19610 6e 73 20 74 68 61 74 20 72 65 66 20 75 6e 69 71  ns that ref uniq
19620 75 65 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 20 20  ue values */..  
19630 69 66 28 20 70 2d 3e 69 3d 3d 30 20 29 7b 0a 20  if( p->i==0 ){. 
19640 20 20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 30     nPriorSat = 0
19650 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
19660 50 72 69 6f 72 53 61 74 20 3d 20 70 2d 3e 61 4c  PriorSat = p->aL
19670 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61  evel[p->i-1].pla
19680 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 69 66  n.nOBSat;.    if
19690 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
196a0 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
196b0 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
196c0 29 20 29 20 72 65 74 75 72 6e 20 6e 50 72 69 6f  ) ) return nPrio
196d0 72 53 61 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rSat;.  }.  if( 
196e0 70 2d 3e 69 3d 3d 30 20 7c 7c 20 28 70 2d 3e 61  p->i==0 || (p->a
196f0 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c  Level[p->i-1].pl
19700 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
19710 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29 21 3d  RE_ALL_UNIQUE)!=
19720 30 20 29 7b 0a 20 20 20 20 6e 45 71 4f 6e 65 52  0 ){.    nEqOneR
19730 6f 77 20 3d 20 6e 45 71 43 6f 6c 3b 0a 20 20 7d  ow = nEqCol;.  }
19740 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 45  else{.    if( nE
19750 71 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  qCol==0 ) return
19760 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 20 20   nPriorSat;.    
19770 73 6f 72 74 4f 72 64 65 72 20 3d 20 62 4f 75 74  sortOrder = bOut
19780 65 72 52 65 76 3b 0a 20 20 20 20 6e 45 71 4f 6e  erRev;.    nEqOn
19790 65 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  eRow = 0;.  }.  
197a0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
197b0 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
197c0 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
197d0 0a 20 20 69 66 28 20 77 73 46 6c 61 67 73 20 26  .  if( wsFlags &
197e0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
197f0 20 29 20 72 65 74 75 72 6e 20 6e 50 72 69 6f 72   ) return nPrior
19800 53 61 74 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  Sat;.  if( pIdx-
19810 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65  >bUnordered ) re
19820 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a  turn nPriorSat;.
19830 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72    nTerm = pOrder
19840 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  By->nExpr;.  ass
19850 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a  ert( nTerm>0 );.
19860 0a 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70  .  /* Argument p
19870 49 64 78 20 6d 75 73 74 20 65 69 74 68 65 72 20  Idx must either 
19880 70 6f 69 6e 74 20 74 6f 20 61 20 27 72 65 61 6c  point to a 'real
19890 27 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 73 74  ' named index st
198a0 72 75 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f  ructure, .  ** o
198b0 72 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63  r an index struc
198c0 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  ture allocated o
198d0 6e 20 74 68 65 20 73 74 61 63 6b 20 62 79 20 62  n the stack by b
198e0 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 20  estBtreeIndex() 
198f0 74 6f 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  to.  ** represen
19900 74 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65  t the rowid inde
19910 78 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  x that is part o
19920 66 20 65 76 65 72 79 20 74 61 62 6c 65 2e 20 20  f every table.  
19930 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
19940 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64  x->zName || (pId
19950 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26  x->nColumn==1 &&
19960 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
19970 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a  0]==-1) );..  /*
19980 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20   Match terms of 
19990 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
199a0 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  use against colu
199b0 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  mns of.  ** the 
199c0 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
199d0 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63   Note that indic
199e0 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43  es have pIdx->nC
199f0 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f  olumn regular co
19a00 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20  lumns plus.  ** 
19a10 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  one additional c
19a20 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67  olumn containing
19a30 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65   the rowid.  The
19a40 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20   rowid column.  
19a50 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
19a60 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20  is also allowed 
19a70 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
19a80 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
19a90 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
19aa0 20 20 66 6f 72 28 69 3d 30 2c 6a 3d 6e 50 72 69    for(i=0,j=nPri
19ab0 6f 72 53 61 74 2c 70 54 65 72 6d 3d 26 70 4f 72  orSat,pTerm=&pOr
19ac0 64 65 72 42 79 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e  derBy->a[j]; j<n
19ad0 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d  Term && i<=pIdx-
19ae0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
19af0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
19b00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
19b10 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
19b20 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a  ORDER BY pTerm *
19b30 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
19b40 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20  Coll;    /* The 
19b50 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
19b60 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  ce of pExpr */. 
19b70 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f     int termSortO
19b80 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72  rder; /* Sort or
19b90 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72  der for this ter
19ba0 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  m */.    int iCo
19bb0 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54  lumn;       /* T
19bc0 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
19bd0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31  f the index.  -1
19be0 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20   for rowid */.  
19bf0 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72    int iSortOrder
19c00 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45  ;    /* 1 for DE
19c10 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e  SC, 0 for ASC on
19c20 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
19c30 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  term */.    cons
19c40 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f  t char *zColl; /
19c50 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
19c60 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
19c70 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20   for i-th index 
19c80 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78  term */..    pEx
19c90 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
19ca0 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
19cb0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
19cc0 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
19cd0 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  !=base ){.      
19ce0 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61  /* Can not use a
19cf0 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20  n index sort on 
19d00 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73  anything that is
19d10 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e   not a column in
19d20 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65   the.      ** le
19d30 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66  ft-most table of
19d40 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19d50 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
19d60 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c  .    }.    pColl
19d70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19d80 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
19d90 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
19da0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
19db0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
19dc0 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
19dd0 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26  f( pIdx->zName &
19de0 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  & i<pIdx->nColum
19df0 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  n ){.      iColu
19e00 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  mn = pIdx->aiCol
19e10 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
19e20 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ( iColumn==pIdx-
19e30 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
19e40 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  {.        iColum
19e50 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  n = -1;.      }.
19e60 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72        iSortOrder
19e70 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
19e80 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43  der[i];.      zC
19e90 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
19ea0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  ll[i];.    }else
19eb0 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20  {.      iColumn 
19ec0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72  = -1;.      iSor
19ed0 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  tOrder = 0;.    
19ee0 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d    zColl = pColl-
19ef0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20  >zName;.    }.  
19f00 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
19f10 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c  lumn!=iColumn ||
19f20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
19f30 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
19f40 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  oll) ){.      /*
19f50 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f   Term j of the O
19f60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 64  RDER BY clause d
19f70 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f  oes not match co
19f80 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e  lumn i of the in
19f90 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
19fa0 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i<nEqCol ){.   
19fb0 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
19fc0 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
19fd0 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
19fe0 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61  y == fails to ma
19ff0 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a  tch an.        *
1a000 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c  * ORDER BY term,
1a010 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75   that is OK.  Ju
1a020 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63  st ignore that c
1a030 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1a040 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ex.        */.  
1a050 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1a060 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a070 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
1a080 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
1a090 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73  ndex column i is
1a0a0 20 74 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c   the rowid.  All
1a0b0 20 6f 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74   other terms mat
1a0c0 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ch. */.        b
1a0d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
1a0e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
1a0f0 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
1a100 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
1a110 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  and is not const
1a120 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20  rained by ==.   
1a130 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
1a140 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61   index cannot sa
1a150 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
1a160 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  BY constraint.. 
1a170 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1a180 20 20 72 65 74 75 72 6e 20 6e 50 72 69 6f 72 53    return nPriorS
1a190 61 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  at;.      }.    
1a1a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  }.    assert( pI
1a1b0 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  dx->aSortOrder!=
1a1c0 30 20 7c 7c 20 69 43 6f 6c 75 6d 6e 3d 3d 2d 31  0 || iColumn==-1
1a1d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a1e0 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pTerm->sortOrder
1a1f0 3d 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f  ==0 || pTerm->so
1a200 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20  rtOrder==1 );.  
1a210 20 20 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f    assert( iSortO
1a220 72 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74  rder==0 || iSort
1a230 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20  Order==1 );.    
1a240 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20  termSortOrder = 
1a250 69 53 6f 72 74 4f 72 64 65 72 20 5e 20 70 54 65  iSortOrder ^ pTe
1a260 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  rm->sortOrder;. 
1a270 20 20 20 69 66 28 20 69 3e 6e 45 71 4f 6e 65 52     if( i>nEqOneR
1a280 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ow ){.      if( 
1a290 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73  termSortOrder!=s
1a2a0 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
1a2b0 20 20 20 20 2f 2a 20 49 6e 64 69 63 65 73 20 63      /* Indices c
1a2c0 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
1a2d0 69 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  if all ORDER BY 
1a2e0 74 65 72 6d 73 20 70 61 73 74 20 74 68 65 0a 20  terms past the. 
1a2f0 20 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69         ** equali
1a300 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ty constraints a
1a310 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 44 45  re all either DE
1a320 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20  SC or ASC. */.  
1a330 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a340 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1a350 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
1a360 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b  = termSortOrder;
1a370 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a  .    }.    j++;.
1a380 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20      pTerm++;.   
1a390 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29   if( iColumn<0 )
1a3a0 7b 0a 20 20 20 20 20 20 73 65 65 6e 52 6f 77 69  {.      seenRowi
1a3b0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  d = 1;.      bre
1a3c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1a3d0 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64  *pbRev = sortOrd
1a3e0 65 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  er;..  /* If the
1a3f0 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
1a400 20 42 59 20 72 6f 77 69 64 22 20 74 65 72 6d 20   BY rowid" term 
1a410 74 68 61 74 20 6d 61 74 63 68 65 64 2c 20 6f 72  that matched, or
1a420 20 69 74 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a   it is only.  **
1a430 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
1a440 73 69 6e 67 6c 65 20 72 6f 77 20 66 72 6f 6d 20  single row from 
1a450 74 68 69 73 20 74 61 62 6c 65 20 74 6f 20 6d 61  this table to ma
1a460 74 63 68 2c 20 74 68 65 6e 20 73 6b 69 70 20 6f  tch, then skip o
1a470 76 65 72 0a 20 20 2a 2a 20 61 6e 79 20 61 64 64  ver.  ** any add
1a480 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52 20 42 59  itional ORDER BY
1a490 20 74 65 72 6d 73 20 64 65 61 6c 69 6e 67 20 77   terms dealing w
1a4a0 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 0a  ith this table..
1a4b0 20 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6e 52    */.  if( seenR
1a4c0 6f 77 69 64 20 7c 7c 0a 20 20 20 20 20 28 20 20  owid ||.     (  
1a4d0 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52   (wsFlags & WHER
1a4e0 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 3d 3d  E_COLUMN_NULL)==
1a4f0 30 0a 20 20 20 20 20 20 26 26 20 69 3e 3d 70 49  0.      && i>=pI
1a500 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  dx->nColumn.    
1a510 20 20 26 26 20 69 6e 64 65 78 49 73 55 6e 69 71    && indexIsUniq
1a520 75 65 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20  ueNotNull(pIdx, 
1a530 6e 45 71 43 6f 6c 29 0a 20 20 20 20 20 29 0a 20  nEqCol).     ). 
1a540 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e   ){.    /* Advan
1a550 63 65 20 6a 20 6f 76 65 72 20 61 64 64 69 74 69  ce j over additi
1a560 6f 6e 61 6c 20 4f 52 44 45 52 20 42 59 20 74 65  onal ORDER BY te
1a570 72 6d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  rms associated w
1a580 69 74 68 20 62 61 73 65 20 2a 2f 0a 20 20 20 20  ith base */.    
1a590 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1a5a0 53 20 3d 20 70 2d 3e 70 57 43 2d 3e 70 4d 61 73  S = p->pWC->pMas
1a5b0 6b 53 65 74 3b 0a 20 20 20 20 42 69 74 6d 61 73  kSet;.    Bitmas
1a5c0 6b 20 6d 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70  k m = ~getMask(p
1a5d0 4d 53 2c 20 62 61 73 65 29 3b 0a 20 20 20 20 77  MS, base);.    w
1a5e0 68 69 6c 65 28 20 6a 3c 6e 54 65 72 6d 20 26 26  hile( j<nTerm &&
1a5f0 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65   (exprTableUsage
1a600 28 70 4d 53 2c 20 70 4f 72 64 65 72 42 79 2d 3e  (pMS, pOrderBy->
1a610 61 5b 6a 5d 2e 70 45 78 70 72 29 26 6d 29 3d 3d  a[j].pExpr)&m)==
1a620 30 20 29 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  0 ){.      j++;.
1a630 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a640 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn j;.}../*.** F
1a650 69 6e 64 20 74 68 65 20 62 65 73 74 20 71 75 65  ind the best que
1a660 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65  ry plan for acce
1a670 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c  ssing a particul
1a680 61 72 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65  ar table.  Write
1a690 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65   the.** best que
1a6a0 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20  ry plan and its 
1a6b0 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 70 2d  cost into the p-
1a6c0 3e 63 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  >cost..**.** The
1a6d0 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 6c 61   lowest cost pla
1a6e0 6e 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73  n wins.  The cos
1a6f0 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  t is an estimate
1a700 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   of the amount o
1a710 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73  f.** CPU and dis
1a720 6b 20 49 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20  k I/O needed to 
1a730 70 72 6f 63 65 73 73 20 74 68 65 20 72 65 71 75  process the requ
1a740 65 73 74 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a  ested result..**
1a750 20 46 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e   Factors that in
1a760 66 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63  fluence cost inc
1a770 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  lude:.**.**    *
1a780 20 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20    The estimated 
1a790 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
1a7a0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72  hat will be retr
1a7b0 69 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20  ieved.  (The.** 
1a7c0 20 20 20 20 20 20 66 65 77 65 72 20 74 68 65 20        fewer the 
1a7d0 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20  better.).**.**  
1a7e0 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20    *  Whether or 
1a7f0 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74  not sorting must
1a800 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   occur..**.**   
1a810 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e   *  Whether or n
1a820 6f 74 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  ot there must be
1a830 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70   separate lookup
1a840 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  s in the.**     
1a850 20 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74    index and in t
1a860 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a  he main table..*
1a870 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61  *.** If there wa
1a880 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
1a890 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 70 49  clause (pSrc->pI
1a8a0 6e 64 65 78 29 20 61 74 74 61 63 68 65 64 20 74  ndex) attached t
1a8b0 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a  o the table in.*
1a8c0 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
1a8d0 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ent, then this f
1a8e0 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e  unction only con
1a8f0 73 69 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69  siders plans usi
1a900 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64  ng the .** named
1a910 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73 75   index. If no su
1a920 63 68 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64  ch plan is found
1a930 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
1a940 6e 65 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53  ned cost is.** S
1a950 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49  QLITE_BIG_DBL. I
1a960 66 20 61 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e  f a plan is foun
1a970 64 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  d that uses the 
1a980 6e 61 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a  named index, .**
1a990 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69   then the cost i
1a9a0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 69 6e 20  s calculated in 
1a9b0 74 68 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a  the usual way..*
1a9c0 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e  *.** If a NOT IN
1a9d0 44 45 58 45 44 20 63 6c 61 75 73 65 20 28 70 53  DEXED clause (pS
1a9e0 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 21 3d  rc->notIndexed!=
1a9f0 30 29 20 77 61 73 20 61 74 74 61 63 68 65 64 20  0) was attached 
1aa00 74 6f 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  to the table .**
1aa10 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
1aa20 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e  tatement, then n
1aa30 6f 20 69 6e 64 65 78 65 73 20 61 72 65 20 63 6f  o indexes are co
1aa40 6e 73 69 64 65 72 65 64 2e 20 48 6f 77 65 76 65  nsidered. Howeve
1aa50 72 2c 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65 63  r, the .** selec
1aa60 74 65 64 20 70 6c 61 6e 20 6d 61 79 20 73 74 69  ted plan may sti
1aa70 6c 6c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  ll take advantag
1aa80 65 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  e of the built-i
1aa90 6e 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  n rowid primary 
1aaa0 6b 65 79 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f  key.** index..*/
1aab0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
1aac0 74 42 74 72 65 65 49 6e 64 65 78 28 57 68 65 72  tBtreeIndex(Wher
1aad0 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20 20  eBestIdx *p){.  
1aae0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1aaf0 70 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20 54  p->pParse;  /* T
1ab00 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1ab10 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
1ab20 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57  use *pWC = p->pW
1ab30 43 3b 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45  C;  /* The WHERE
1ab40 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1ab50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ab60 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
1ab70 3b 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c  ; /* The FROM cl
1ab80 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
1ab90 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  rch */.  int iCu
1aba0 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  r = pSrc->iCurso
1abb0 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
1abc0 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
1abd0 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a  to be accessed *
1abe0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
1abf0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ac00 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
1ac10 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
1ac20 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ac40 2a 20 43 6f 70 79 20 6f 66 20 70 50 72 6f 62 65  * Copy of pProbe
1ac50 2c 20 6f 72 20 7a 65 72 6f 20 66 6f 72 20 49 50  , or zero for IP
1ac60 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  K index */.  int
1ac70 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20   eqTermMask;    
1ac80 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1ac90 65 6e 74 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69  ent mask of vali
1aca0 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61  d equality opera
1acb0 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64  tors */.  int id
1acc0 78 45 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20  xEqTermMask;    
1acd0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6d        /* Index m
1ace0 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75  ask of valid equ
1acf0 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20  ality operators 
1ad00 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
1ad30 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
1ad40 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
1ad50 20 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73   tRowcnt aiRowEs
1ad60 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20  tPk[2];      /* 
1ad70 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76  The aiRowEst[] v
1ad80 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
1ad90 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
1ada0 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
1adb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
1adc0 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
1add0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
1ade0 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67   */.  int wsFlag
1adf0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1ae00 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 66 6c 61    /* Allowed fla
1ae10 67 73 20 69 6e 20 70 2d 3e 63 6f 73 74 2e 70 6c  gs in p->cost.pl
1ae20 61 6e 2e 77 73 46 6c 61 67 20 2a 2f 0a 0a 20 20  an.wsFlag */..  
1ae30 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1ae40 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f 72 73  e cost to a wors
1ae50 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a 2f 0a  t-case value */.
1ae60 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 63 6f 73    memset(&p->cos
1ae70 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  t, 0, sizeof(p->
1ae80 63 6f 73 74 29 29 3b 0a 20 20 70 2d 3e 63 6f 73  cost));.  p->cos
1ae90 74 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  t.rCost = SQLITE
1aea0 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20  _BIG_DBL;..  /* 
1aeb0 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62 6c  If the pSrc tabl
1aec0 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
1aed0 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
1aee0 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79 20  OIN then we may 
1aef0 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20  not.  ** use an 
1af00 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66 79  index to satisfy
1af10 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61   IS NULL constra
1af20 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61 62  ints on that tab
1af30 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a  le.  This is.  *
1af40 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e  * because column
1af50 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  s might end up b
1af60 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68 65  eing NULL if the
1af70 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
1af80 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63  match -.  ** a c
1af90 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69 63  ircumstance whic
1afa0 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e  h the index cann
1afb0 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63 6f  ot help us disco
1afc0 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32 31  ver.  Ticket #21
1afd0 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  77..  */.  if( p
1afe0 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
1aff0 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 69  JT_LEFT ){.    i
1b000 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57  dxEqTermMask = W
1b010 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65  O_EQ|WO_IN;.  }e
1b020 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71 54 65  lse{.    idxEqTe
1b030 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
1b040 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a  O_IN|WO_ISNULL;.
1b050 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63 2d    }..  if( pSrc-
1b060 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  >pIndex ){.    /
1b070 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
1b080 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
1b090 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
1b0a0 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
1b0b0 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65 20    pIdx = pProbe 
1b0c0 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a  = pSrc->pIndex;.
1b0d0 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d      wsFlagMask =
1b0e0 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   ~(WHERE_ROWID_E
1b0f0 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
1b100 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d  NGE);.    eqTerm
1b110 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d  Mask = idxEqTerm
1b120 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mask;.  }else{. 
1b130 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
1b140 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
1b150 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
1b160 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
1b170 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a   in local.    **
1b180 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f   variable sPk to
1b190 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
1b1a0 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
1b1b0 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68   index.  Make th
1b1c0 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69  is.    ** fake i
1b1d0 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69  ndex the first i
1b1e0 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64  n a chain of Ind
1b1f0 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20  ex objects with 
1b200 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a  all of the real.
1b210 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74      ** indices t
1b220 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
1b230 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b250 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c  /* First of real
1b260 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
1b270 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
1b280 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
1b290 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
1b2a0 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
1b2b0 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
1b2c0 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
1b2d0 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45  ;.    sPk.aiRowE
1b2e0 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
1b2f0 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
1b300 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
1b310 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
1b320 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20  pSrc->pTab;.    
1b330 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
1b340 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  pSrc->pTab->nRow
1b350 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
1b360 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20  tPk[1] = 1;.    
1b370 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
1b380 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1b390 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
1b3a0 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
1b3b0 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
1b3c0 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
1b3d0 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
1b3e0 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
1b3f0 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
1b400 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
1b410 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
1b420 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1b430 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
1b440 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
1b450 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
1b460 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73  k;.    wsFlagMas
1b470 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20 57  k = ~(.        W
1b480 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57  HERE_COLUMN_IN|W
1b490 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
1b4a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
1b4b0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  |WHERE_COLUMN_RA
1b4c0 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 65  NGE.    );.    e
1b4d0 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45  qTermMask = WO_E
1b4e0 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49 64  Q|WO_IN;.    pId
1b4f0 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
1b500 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
1b510 6e 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66  ndices looking f
1b520 6f 72 20 74 68 65 20 62 65 73 74 20 6f 6e 65 20  or the best one 
1b530 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f  to use.  */.  fo
1b540 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 49 64 78  r(; pProbe; pIdx
1b550 3d 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e  =pProbe=pProbe->
1b560 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73  pNext){.    cons
1b570 74 20 74 52 6f 77 63 6e 74 20 2a 20 63 6f 6e 73  t tRowcnt * cons
1b580 74 20 61 69 52 6f 77 45 73 74 20 3d 20 70 50 72  t aiRowEst = pPr
1b590 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20  obe->aiRowEst;. 
1b5a0 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20     double cost; 
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b5c0 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
1b5d0 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20 64 6f  pProbe */.    do
1b5e0 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20 20  uble nRow;      
1b5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
1b600 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
1b610 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c 74 20   rows in result 
1b620 73 65 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  set */.    doubl
1b630 65 20 6c 6f 67 31 30 4e 20 3d 20 28 64 6f 75 62  e log10N = (doub
1b640 6c 65 29 31 3b 20 20 2f 2a 20 62 61 73 65 2d 31  le)1;  /* base-1
1b650 30 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 6e  0 logarithm of n
1b660 52 6f 77 20 28 69 6e 65 78 61 63 74 29 20 2a 2f  Row (inexact) */
1b670 0a 20 20 20 20 69 6e 74 20 62 52 65 76 20 3d 20  .    int bRev = 
1b680 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
1b690 20 2f 2a 20 30 3d 66 6f 72 77 61 72 64 20 73 63   /* 0=forward sc
1b6a0 61 6e 2e 20 20 31 3d 72 65 76 65 72 73 65 2e 20  an.  1=reverse. 
1b6b0 20 32 3d 75 6e 64 65 63 69 64 65 64 20 2a 2f 0a   2=undecided */.
1b6c0 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20      int wsFlags 
1b6d0 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b  = 0;.    Bitmask
1b6e0 20 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20   used = 0;..    
1b6f0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1b700 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 70   variables are p
1b710 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  opulated based o
1b720 6e 20 74 68 65 20 70 72 6f 70 65 72 74 69 65 73  n the properties
1b730 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   of.    ** index
1b740 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
1b750 2e 20 54 68 65 79 20 61 72 65 20 74 68 65 6e 20  . They are then 
1b760 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
1b770 65 20 74 68 65 20 65 78 70 65 63 74 65 64 0a 20  e the expected. 
1b780 20 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20 6e     ** cost and n
1b790 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65  umber of rows re
1b7a0 74 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  turned..    **. 
1b7b0 20 20 20 2a 2a 20 20 6e 45 71 3a 20 0a 20 20 20     **  nEq: .   
1b7c0 20 2a 2a 20 20 20 20 4e 75 6d 62 65 72 20 6f 66   **    Number of
1b7d0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20   equality terms 
1b7e0 74 68 61 74 20 63 61 6e 20 62 65 20 69 6d 70 6c  that can be impl
1b7f0 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68  emented using th
1b800 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20  e index..    ** 
1b810 20 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64     In other word
1b820 73 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  s, the number of
1b830 20 69 6e 69 74 69 61 6c 20 66 69 65 6c 64 73 20   initial fields 
1b840 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  in the index tha
1b850 74 0a 20 20 20 20 2a 2a 20 20 20 20 61 72 65 20  t.    **    are 
1b860 75 73 65 64 20 69 6e 20 3d 3d 20 6f 72 20 49 4e  used in == or IN
1b870 20 6f 72 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   or NOT NULL con
1b880 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20  straints of the 
1b890 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
1b8a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 49 6e    **.    **  nIn
1b8b0 4d 75 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20  Mul:  .    **   
1b8c0 20 54 68 65 20 22 69 6e 2d 6d 75 6c 74 69 70 6c   The "in-multipl
1b8d0 69 65 72 22 2e 20 54 68 69 73 20 69 73 20 61 6e  ier". This is an
1b8e0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 68 6f 77   estimate of how
1b8f0 20 6d 61 6e 79 20 73 65 65 6b 20 6f 70 65 72 61   many seek opera
1b900 74 69 6f 6e 73 20 0a 20 20 20 20 2a 2a 20 20 20  tions .    **   
1b910 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72   SQLite must per
1b920 66 6f 72 6d 20 6f 6e 20 74 68 65 20 69 6e 64 65  form on the inde
1b930 78 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 46  x in question. F
1b940 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1b950 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 57 48  he .    **    WH
1b960 45 52 45 20 63 6c 61 75 73 65 20 69 73 3a 0a 20  ERE clause is:. 
1b970 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1b980 20 20 57 48 45 52 45 20 61 20 49 4e 20 28 31 2c    WHERE a IN (1,
1b990 20 32 2c 20 33 29 20 41 4e 44 20 62 20 49 4e 20   2, 3) AND b IN 
1b9a0 28 34 2c 20 35 2c 20 36 29 0a 20 20 20 20 2a 2a  (4, 5, 6).    **
1b9b0 0a 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74  .    **    SQLit
1b9c0 65 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 39  e must perform 9
1b9d0 20 6c 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 69   lookups on an i
1b9e0 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20  ndex on (a, b), 
1b9f0 73 6f 20 6e 49 6e 4d 75 6c 20 69 73 20 0a 20 20  so nInMul is .  
1ba00 20 20 2a 2a 20 20 20 20 73 65 74 20 74 6f 20 39    **    set to 9
1ba10 2e 20 47 69 76 65 6e 20 74 68 65 20 73 61 6d 65  . Given the same
1ba20 20 73 63 68 65 6d 61 20 61 6e 64 20 65 69 74 68   schema and eith
1ba30 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  er of the follow
1ba40 69 6e 67 20 57 48 45 52 45 20 0a 20 20 20 20 2a  ing WHERE .    *
1ba50 2a 20 20 20 20 63 6c 61 75 73 65 73 3a 0a 20 20  *    clauses:.  
1ba60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ba70 20 57 48 45 52 45 20 61 20 3d 20 20 31 0a 20 20   WHERE a =  1.  
1ba80 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20    **      WHERE 
1ba90 61 20 3e 3d 20 32 0a 20 20 20 20 2a 2a 0a 20 20  a >= 2.    **.  
1baa0 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69    **    nInMul i
1bab0 73 20 73 65 74 20 74 6f 20 31 2e 0a 20 20 20 20  s set to 1..    
1bac0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 49 66 20  **.    **    If 
1bad0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 57  there exists a W
1bae0 48 45 52 45 20 74 65 72 6d 20 6f 66 20 74 68 65  HERE term of the
1baf0 20 66 6f 72 6d 20 22 78 20 49 4e 20 28 53 45 4c   form "x IN (SEL
1bb00 45 43 54 20 2e 2e 2e 29 22 2c 20 74 68 65 6e 20  ECT ...)", then 
1bb10 0a 20 20 20 20 2a 2a 20 20 20 20 74 68 65 20 73  .    **    the s
1bb20 75 62 2d 73 65 6c 65 63 74 20 69 73 20 61 73 73  ub-select is ass
1bb30 75 6d 65 64 20 74 6f 20 72 65 74 75 72 6e 20 32  umed to return 2
1bb40 35 20 72 6f 77 73 20 66 6f 72 20 74 68 65 20 70  5 rows for the p
1bb50 75 72 70 6f 73 65 73 20 6f 66 20 0a 20 20 20 20  urposes of .    
1bb60 2a 2a 20 20 20 20 64 65 74 65 72 6d 69 6e 69 6e  **    determinin
1bb70 67 20 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a  g nInMul..    **
1bb80 0a 20 20 20 20 2a 2a 20 20 6e 4f 72 64 65 72 65  .    **  nOrdere
1bb90 64 3a 0a 20 20 20 20 2a 2a 20 20 20 20 54 68 65  d:.    **    The
1bba0 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   number of equal
1bbb0 69 74 79 20 74 65 72 6d 73 20 74 68 61 74 20 61  ity terms that a
1bbc0 72 65 20 63 6f 6e 73 74 72 61 69 6e 74 65 64 20  re constrainted 
1bbd0 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70 0a 20 20  by outer loop.  
1bbe0 20 20 2a 2a 20 20 20 20 76 61 72 69 61 62 6c 65    **    variable
1bbf0 73 20 74 68 61 74 20 61 72 65 20 77 65 6c 6c 2d  s that are well-
1bc00 6f 72 64 65 72 65 64 2e 0a 20 20 20 20 2a 2a 0a  ordered..    **.
1bc10 20 20 20 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20      **  bInEst: 
1bc20 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 65 74 20   .    **    Set 
1bc30 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 72 65  to true if there
1bc40 20 77 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e   was at least on
1bc50 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  e "x IN (SELECT 
1bc60 2e 2e 2e 29 22 20 74 65 72 6d 20 75 73 65 64 20  ...)" term used 
1bc70 0a 20 20 20 20 2a 2a 20 20 20 20 69 6e 20 64 65  .    **    in de
1bc80 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 76 61  termining the va
1bc90 6c 75 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e 20 20  lue of nInMul.  
1bca0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 52 48  Note that the RH
1bcb0 53 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  S of the.    ** 
1bcc0 20 20 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d     IN operator m
1bcd0 75 73 74 20 62 65 20 61 20 53 45 4c 45 43 54 2c  ust be a SELECT,
1bce0 20 6e 6f 74 20 61 20 76 61 6c 75 65 20 6c 69 73   not a value lis
1bcf0 74 2c 20 66 6f 72 20 74 68 69 73 20 76 61 72 69  t, for this vari
1bd00 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 74  able.    **    t
1bd10 6f 20 62 65 20 74 72 75 65 2e 0a 20 20 20 20 2a  o be true..    *
1bd20 2a 0a 20 20 20 20 2a 2a 20 20 72 61 6e 67 65 44  *.    **  rangeD
1bd30 69 76 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41 6e  iv:.    **    An
1bd40 20 65 73 74 69 6d 61 74 65 20 6f 66 20 61 20 64   estimate of a d
1bd50 69 76 69 73 6f 72 20 62 79 20 77 68 69 63 68 20  ivisor by which 
1bd60 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65  to reduce the se
1bd70 61 72 63 68 20 73 70 61 63 65 20 64 75 65 0a 20  arch space due. 
1bd80 20 20 20 2a 2a 20 20 20 20 74 6f 20 69 6e 65 71     **    to ineq
1bd90 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1bda0 74 73 2e 20 20 49 6e 20 74 68 65 20 61 62 73 65  ts.  In the abse
1bdb0 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
1bdc0 61 74 33 20 41 4e 41 4c 59 5a 45 0a 20 20 20 20  at3 ANALYZE.    
1bdd0 2a 2a 20 20 20 20 64 61 74 61 2c 20 61 20 73 69  **    data, a si
1bde0 6e 67 6c 65 20 69 6e 65 71 75 61 6c 69 74 79 20  ngle inequality 
1bdf0 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
1be00 63 68 20 73 70 61 63 65 20 74 6f 20 31 2f 34 72  ch space to 1/4r
1be10 64 20 69 74 73 0a 20 20 20 20 2a 2a 20 20 20 20  d its.    **    
1be20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 28 72  original size (r
1be30 61 6e 67 65 44 69 76 3d 3d 34 29 2e 20 20 54 77  angeDiv==4).  Tw
1be40 6f 20 69 6e 65 71 75 61 6c 69 74 69 65 73 20 72  o inequalities r
1be50 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
1be60 0a 20 20 20 20 2a 2a 20 20 20 20 73 70 61 63 65  .    **    space
1be70 20 74 6f 20 31 2f 31 36 74 68 20 6f 66 20 69 74   to 1/16th of it
1be80 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20  s original size 
1be90 28 72 61 6e 67 65 44 69 76 3d 3d 31 36 29 2e 0a  (rangeDiv==16)..
1bea0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62      **.    **  b
1beb0 53 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a 2a 20  Sort:   .    ** 
1bec0 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65     Boolean. True
1bed0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1bee0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1bef0 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
1bf00 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20  e an .    **    
1bf10 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 28 69  external sort (i
1bf20 2e 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74 68 65  .e. scanning the
1bf30 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61   index being eva
1bf40 6c 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f 74 20  luated will not 
1bf50 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 72 72 65  .    **    corre
1bf60 63 74 6c 79 20 6f 72 64 65 72 20 72 65 63 6f 72  ctly order recor
1bf70 64 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ds)..    **.    
1bf80 2a 2a 20 20 62 44 69 73 74 69 6e 63 74 3a 0a 20  **  bDistinct:. 
1bf90 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e     **    Boolean
1bfa0 2e 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  . True if there 
1bfb0 69 73 20 61 20 44 49 53 54 49 4e 43 54 20 63 6c  is a DISTINCT cl
1bfc0 61 75 73 65 20 74 68 61 74 20 77 69 6c 6c 20 72  ause that will r
1bfd0 65 71 75 69 72 65 20 61 6e 20 0a 20 20 20 20 2a  equire an .    *
1bfe0 2a 20 20 20 20 65 78 74 65 72 6e 61 6c 20 62 74  *    external bt
1bff0 72 65 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ree..    **.    
1c000 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20 20  **  bLookup: .  
1c010 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e    **    Boolean.
1c020 20 54 72 75 65 20 69 66 20 61 20 74 61 62 6c 65   True if a table
1c030 20 6c 6f 6f 6b 75 70 20 69 73 20 72 65 71 75 69   lookup is requi
1c040 72 65 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64  red for each ind
1c050 65 78 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20  ex entry.    ** 
1c060 20 20 20 76 69 73 69 74 65 64 2e 20 20 49 6e 20     visited.  In 
1c070 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 72 75  other words, tru
1c080 65 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  e if this is not
1c090 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1c0a0 78 2e 0a 20 20 20 20 2a 2a 20 20 20 20 54 68 69  x..    **    Thi
1c0b0 73 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73  s is always fals
1c0c0 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20  e for the rowid 
1c0d0 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
1c0e0 78 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 20 20  x of a table..  
1c0f0 20 20 2a 2a 20 20 20 20 46 6f 72 20 6f 74 68 65    **    For othe
1c100 72 20 69 6e 64 65 78 65 73 2c 20 69 74 20 69 73  r indexes, it is
1c110 20 74 72 75 65 20 75 6e 6c 65 73 73 20 61 6c 6c   true unless all
1c120 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
1c130 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
1c140 20 20 20 20 75 73 65 64 20 62 79 20 74 68 65 20      used by the 
1c150 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1c160 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20   are present in 
1c170 74 68 65 20 69 6e 64 65 78 20 28 73 75 63 68 20  the index (such 
1c180 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 69 6e 64  an.    **    ind
1c190 65 78 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  ex is sometimes 
1c1a0 64 65 73 63 72 69 62 65 64 20 61 73 20 61 20 63  described as a c
1c1b0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 29 2e 0a  overing index)..
1c1c0 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20 65 78      **    For ex
1c1d0 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20 74 68 65  ample, given the
1c1e0 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29   index on (a, b)
1c1f0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 66 20  , the second of 
1c200 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20  the following . 
1c210 20 20 20 2a 2a 20 20 20 20 74 77 6f 20 71 75 65     **    two que
1c220 72 69 65 73 20 72 65 71 75 69 72 65 73 20 74 61  ries requires ta
1c230 62 6c 65 20 62 2d 74 72 65 65 20 6c 6f 6f 6b 75  ble b-tree looku
1c240 70 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  ps in order to f
1c250 69 6e 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20  ind the value.  
1c260 20 20 2a 2a 20 20 20 20 6f 66 20 63 6f 6c 75 6d    **    of colum
1c270 6e 20 63 2c 20 62 75 74 20 74 68 65 20 66 69 72  n c, but the fir
1c280 73 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 63 61  st does not beca
1c290 75 73 65 20 63 6f 6c 75 6d 6e 73 20 61 20 61 6e  use columns a an
1c2a0 64 20 62 20 61 72 65 0a 20 20 20 20 2a 2a 20 20  d b are.    **  
1c2b0 20 20 62 6f 74 68 20 61 76 61 69 6c 61 62 6c 65    both available
1c2c0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   in the index.. 
1c2d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1c2e0 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
1c2f0 61 2c 20 62 20 20 20 20 46 52 4f 4d 20 74 62 6c  a, b    FROM tbl
1c300 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20   WHERE a = 1;.  
1c310 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1c320 20 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20   SELECT a, b, c 
1c330 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61  FROM tbl WHERE a
1c340 20 3d 20 31 3b 0a 20 20 20 20 2a 2f 0a 20 20 20   = 1;.    */.   
1c350 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c370 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
1c380 72 20 49 4e 20 74 65 72 6d 73 20 6d 61 74 63 68  r IN terms match
1c390 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
1c3a0 20 69 6e 74 20 6e 4f 72 64 65 72 65 64 3b 20 20   int nOrdered;  
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c3c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65  * Number of orde
1c3d0 72 65 64 20 74 65 72 6d 73 20 6d 61 74 63 68 69  red terms matchi
1c3e0 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
1c3f0 69 6e 74 20 62 49 6e 45 73 74 20 3d 20 30 3b 20  int bInEst = 0; 
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c410 20 54 72 75 65 20 69 66 20 22 78 20 49 4e 20 28   True if "x IN (
1c420 53 45 4c 45 43 54 2e 2e 2e 29 22 20 73 65 65 6e  SELECT...)" seen
1c430 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d   */.    int nInM
1c440 75 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ul = 1;         
1c450 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c460 6f 66 20 64 69 73 74 69 6e 63 74 20 65 71 75 61  of distinct equa
1c470 6c 69 74 69 65 73 20 74 6f 20 6c 6f 6f 6b 75 70  lities to lookup
1c480 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 72   */.    double r
1c490 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c  angeDiv = (doubl
1c4a0 65 29 31 3b 20 20 2f 2a 20 45 73 74 69 6d 61 74  e)1;  /* Estimat
1c4b0 65 64 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20  ed reduction in 
1c4c0 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
1c4d0 20 20 20 20 69 6e 74 20 6e 42 6f 75 6e 64 20 3d      int nBound =
1c4e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c4f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
1c500 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1c510 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   seen */.    int
1c520 20 62 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20   bSort;         
1c530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c540 75 65 20 69 66 20 65 78 74 65 72 6e 61 6c 20 73  ue if external s
1c550 6f 72 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ort required */.
1c560 20 20 20 20 69 6e 74 20 62 44 69 73 74 3b 20 20      int bDist;  
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 64    /* True if ind
1c590 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 77  ex cannot help w
1c5a0 69 74 68 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ith DISTINCT */.
1c5b0 20 20 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 20      int bLookup 
1c5c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1c5d0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 74    /* True if not
1c5e0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1c5f0 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4f 42  x */.    int nOB
1c600 53 61 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sat = 0;        
1c610 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c620 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
1c630 6d 73 20 73 61 74 69 73 66 69 65 64 20 2a 2f 0a  ms satisfied */.
1c640 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79      int nOrderBy
1c650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c660 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
1c670 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
1c680 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1c690 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
1c6a0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
1c6b0 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
1c6c0 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 64 65   clause */.#ifde
1c6d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c6e0 53 54 41 54 33 0a 20 20 20 20 57 68 65 72 65 54  STAT3.    WhereT
1c6f0 65 72 6d 20 2a 70 46 69 72 73 74 54 65 72 6d 20  erm *pFirstTerm 
1c700 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  = 0;    /* First
1c710 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 74   term matching t
1c720 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65 6e 64  he index */.#end
1c730 69 66 0a 0a 20 20 20 20 6e 4f 72 64 65 72 42 79  if..    nOrderBy
1c740 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3f   = p->pOrderBy ?
1c750 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45   p->pOrderBy->nE
1c760 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 62 53 6f  xpr : 0;.    bSo
1c770 72 74 20 3d 20 6e 4f 72 64 65 72 42 79 3e 30 20  rt = nOrderBy>0 
1c780 26 26 20 28 70 2d 3e 69 3d 3d 30 20 7c 7c 20 70  && (p->i==0 || p
1c790 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1c7a0 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3c 6e 4f 72  .plan.nOBSat<nOr
1c7b0 64 65 72 42 79 29 3b 0a 20 20 20 20 62 44 69 73  derBy);.    bDis
1c7c0 74 20 3d 20 70 2d 3e 69 3d 3d 30 20 26 26 20 70  t = p->i==0 && p
1c7d0 2d 3e 70 44 69 73 74 69 6e 63 74 21 3d 30 3b 0a  ->pDistinct!=0;.
1c7e0 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  .    /* Determin
1c7f0 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  e the values of 
1c800 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c 20 2a  nEq and nInMul *
1c810 2f 0a 20 20 20 20 66 6f 72 28 6e 45 71 3d 6e 4f  /.    for(nEq=nO
1c820 72 64 65 72 65 64 3d 30 3b 20 6e 45 71 3c 70 50  rdered=0; nEq<pP
1c830 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e  robe->nColumn; n
1c840 45 71 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  Eq++){.      int
1c850 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43   j = pProbe->aiC
1c860 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20  olumn[nEq];.    
1c870 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
1c880 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
1c890 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 65 71   p->notReady, eq
1c8a0 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29 3b  TermMask, pIdx);
1c8b0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1c8c0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
1c8d0 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 57     wsFlags |= (W
1c8e0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
1c8f0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3b 0a  HERE_ROWID_EQ);.
1c900 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c910 70 54 65 72 6d 2d 3e 70 57 43 21 3d 70 57 43 20  pTerm->pWC!=pWC 
1c920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
1c930 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1c940 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
1c950 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1c960 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
1c970 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1c980 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
1c990 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
1c9a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c9b0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1c9c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
1c9d0 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  * "x IN (SELECT 
1c9e0 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d 65 20 74  ...)":  Assume t
1c9f0 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
1ca00 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s 25 rows */.   
1ca10 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d         nInMul *=
1ca20 20 32 35 3b 0a 20 20 20 20 20 20 20 20 20 20 62   25;.          b
1ca30 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  InEst = 1;.     
1ca40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
1ca50 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  AYS(pExpr->x.pLi
1ca60 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70  st && pExpr->x.p
1ca70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
1ca80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20            /* "x 
1ca90 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
1caa0 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
1cab0 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 70       nInMul *= p
1cac0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1cad0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
1cae0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1caf0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1cb00 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
1cb10 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
1cb20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
1cb30 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 69 66  NULL;.        if
1cb40 28 20 6e 45 71 3d 3d 6e 4f 72 64 65 72 65 64 20  ( nEq==nOrdered 
1cb50 29 20 6e 4f 72 64 65 72 65 64 2b 2b 3b 0a 20 20  ) nOrdered++;.  
1cb60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53      }else if( bS
1cb70 6f 72 74 20 26 26 20 6e 45 71 3d 3d 6e 4f 72 64  ort && nEq==nOrd
1cb80 65 72 65 64 20 26 26 20 69 73 4f 72 64 65 72 65  ered && isOrdere
1cb90 64 54 65 72 6d 28 70 2c 20 70 54 65 72 6d 2c 20  dTerm(p, pTerm, 
1cba0 26 62 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20  &bRev) ){.      
1cbb0 20 20 6e 4f 72 64 65 72 65 64 2b 2b 3b 0a 20 20    nOrdered++;.  
1cbc0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
1cbd0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
1cbe0 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  .      if( nEq==
1cbf0 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 53 61  0 && pProbe->aSa
1cc00 6d 70 6c 65 20 29 20 70 46 69 72 73 74 54 65 72  mple ) pFirstTer
1cc10 6d 20 3d 20 70 54 65 72 6d 3b 0a 23 65 6e 64 69  m = pTerm;.#endi
1cc20 66 0a 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20  f.      used |= 
1cc30 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
1cc40 68 74 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  ht;.    }. .    
1cc50 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
1cc60 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64  being considered
1cc70 20 69 73 20 55 4e 49 51 55 45 2c 20 61 6e 64 20   is UNIQUE, and 
1cc80 74 68 65 72 65 20 69 73 20 61 6e 20 65 71 75 61  there is an equa
1cc90 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 63 6f 6e  lity .    ** con
1cca0 73 74 72 61 69 6e 74 20 66 6f 72 20 61 6c 6c 20  straint for all 
1ccb0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
1ccc0 6e 64 65 78 2c 20 74 68 65 6e 20 74 68 69 73 20  ndex, then this 
1ccd0 73 65 61 72 63 68 20 77 69 6c 6c 20 66 69 6e 64  search will find
1cce0 0a 20 20 20 20 2a 2a 20 61 74 20 6d 6f 73 74 20  .    ** at most 
1ccf0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 20 49 6e  a single row. In
1cd00 20 74 68 69 73 20 63 61 73 65 20 73 65 74 20 74   this case set t
1cd10 68 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20  he WHERE_UNIQUE 
1cd20 66 6c 61 67 20 74 6f 20 0a 20 20 20 20 2a 2a 20  flag to .    ** 
1cd30 69 6e 64 69 63 61 74 65 20 74 68 69 73 20 74 6f  indicate this to
1cd40 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
1cd50 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72   **.    ** Other
1cd60 77 69 73 65 2c 20 69 66 20 74 68 65 20 73 65 61  wise, if the sea
1cd70 72 63 68 20 6d 61 79 20 66 69 6e 64 20 6d 6f 72  rch may find mor
1cd80 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 2c 20  e than one row, 
1cd90 74 65 73 74 20 74 6f 20 73 65 65 20 69 66 0a 20  test to see if. 
1cda0 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61     ** there is a
1cdb0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1cdc0 74 20 6f 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  t on indexed col
1cdd0 75 6d 6e 20 28 6e 45 71 2b 31 29 20 74 68 61 74  umn (nEq+1) that
1cde0 20 63 61 6e 20 62 65 20 0a 20 20 20 20 2a 2a 20   can be .    ** 
1cdf0 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
1ce00 74 68 65 20 69 6e 64 65 78 2e 20 0a 20 20 20 20  the index. .    
1ce10 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  */.    if( nEq==
1ce20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
1ce30 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  && pProbe->onErr
1ce40 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
1ce50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
1ce60 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
1ce70 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20  OLUMN_IN );.    
1ce80 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c    testcase( wsFl
1ce90 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
1cea0 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  MN_NULL );.     
1ceb0 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20   if( (wsFlags & 
1cec0 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  (WHERE_COLUMN_IN
1ced0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55  |WHERE_COLUMN_NU
1cee0 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  LL))==0 ){.     
1cef0 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1cf00 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  ERE_UNIQUE;.    
1cf10 20 20 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30 20      if( p->i==0 
1cf20 7c 7c 20 28 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d  || (p->aLevel[p-
1cf30 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61  >i-1].plan.wsFla
1cf40 67 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55  gs & WHERE_ALL_U
1cf50 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20  NIQUE)!=0 ){.   
1cf60 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
1cf70 3d 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51  = WHERE_ALL_UNIQ
1cf80 55 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  UE;.        }.  
1cf90 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1cfa0 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f  if( pProbe->bUno
1cfb0 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  rdered==0 ){.   
1cfc0 20 20 20 69 6e 74 20 6a 20 3d 20 28 6e 45 71 3d     int j = (nEq=
1cfd0 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  =pProbe->nColumn
1cfe0 20 3f 20 2d 31 20 3a 20 70 50 72 6f 62 65 2d 3e   ? -1 : pProbe->
1cff0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3b 0a  aiColumn[nEq]);.
1d000 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65        if( findTe
1d010 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
1d020 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57 4f   p->notReady, WO
1d030 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
1d040 57 4f 5f 47 45 2c 20 70 49 64 78 29 20 29 7b 0a  WO_GE, pIdx) ){.
1d050 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
1d060 6d 20 2a 70 54 6f 70 2c 20 2a 70 42 74 6d 3b 0a  m *pTop, *pBtm;.
1d070 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 66          pTop = f
1d080 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
1d090 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61 64  r, j, p->notRead
1d0a0 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
1d0b0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 70  pIdx);.        p
1d0c0 42 74 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  Btm = findTerm(p
1d0d0 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e  WC, iCur, j, p->
1d0e0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
1d0f0 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a 20 20  WO_GE, pIdx);.  
1d100 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
1d110 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
1d120 70 50 72 6f 62 65 2c 20 6e 45 71 2c 20 70 42 74  pProbe, nEq, pBt
1d130 6d 2c 20 70 54 6f 70 2c 20 26 72 61 6e 67 65 44  m, pTop, &rangeD
1d140 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  iv);.        if(
1d150 20 70 54 6f 70 20 29 7b 0a 20 20 20 20 20 20 20   pTop ){.       
1d160 20 20 20 6e 42 6f 75 6e 64 20 3d 20 31 3b 0a 20     nBound = 1;. 
1d170 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73           wsFlags
1d180 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
1d190 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 75  MIT;.          u
1d1a0 73 65 64 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65  sed |= pTop->pre
1d1b0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
1d1c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1d1d0 6f 70 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a  op->pWC!=pWC );.
1d1e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d1f0 20 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20 20    if( pBtm ){.  
1d200 20 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b          nBound++
1d210 3b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c  ;.          wsFl
1d220 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d  ags |= WHERE_BTM
1d230 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
1d240 20 20 75 73 65 64 20 7c 3d 20 70 42 74 6d 2d 3e    used |= pBtm->
1d250 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
1d260 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1d270 20 70 42 74 6d 2d 3e 70 57 43 21 3d 70 57 43 20   pBtm->pWC!=pWC 
1d280 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d290 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1d2a0 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
1d2b0 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  NGE|WHERE_ROWID_
1d2c0 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20 7d 0a  RANGE);.      }.
1d2d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1d2e0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1d2f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
1d300 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1d310 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69 6c 6c   considered will
1d320 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61 6c 6c  .    ** naturall
1d330 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 74  y scan rows in t
1d340 68 65 20 72 65 71 75 69 72 65 64 20 6f 72 64 65  he required orde
1d350 72 2c 20 73 65 74 20 74 68 65 20 61 70 70 72 6f  r, set the appro
1d360 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20 20 20  priate flags.   
1d370 20 2a 2a 20 69 6e 20 77 73 46 6c 61 67 73 2e 20   ** in wsFlags. 
1d380 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1d390 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1d3a0 42 59 20 63 6c 61 75 73 65 20 62 75 74 20 74 68  BY clause but th
1d3b0 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 77  e index.    ** w
1d3c0 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  ill scan rows in
1d3d0 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
1d3e0 65 72 2c 20 73 65 74 20 74 68 65 20 62 53 6f 72  er, set the bSor
1d3f0 74 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a  t variable.  */.
1d400 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
1d410 3e 3d 30 20 26 26 20 62 52 65 76 3c 3d 32 20 29  >=0 && bRev<=2 )
1d420 3b 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20  ;.    if( bSort 
1d430 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1d440 65 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20 20  e( bRev==0 );.  
1d450 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52      testcase( bR
1d460 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74  ev==1 );.      t
1d470 65 73 74 63 61 73 65 28 20 62 52 65 76 3d 3d 32  estcase( bRev==2
1d480 20 29 3b 0a 20 20 20 20 20 20 6e 4f 42 53 61 74   );.      nOBSat
1d490 20 3d 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65   = isSortingInde
1d4a0 78 28 70 2c 20 70 50 72 6f 62 65 2c 20 69 43 75  x(p, pProbe, iCu
1d4b0 72 2c 20 6e 4f 72 64 65 72 65 64 2c 0a 20 20 20  r, nOrdered,.   
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4d0 20 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61             wsFla
1d4e0 67 73 2c 20 62 52 65 76 26 31 2c 20 26 62 52 65  gs, bRev&1, &bRe
1d4f0 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  v);.      if( nO
1d500 72 64 65 72 42 79 3d 3d 6e 4f 42 53 61 74 20 29  rderBy==nOBSat )
1d510 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72 74 20  {.        bSort 
1d520 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77 73 46  = 0;.        wsF
1d530 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f  lags |= WHERE_RO
1d540 57 49 44 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  WID_RANGE|WHERE_
1d550 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
1d560 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20  RE_ORDERBY;.    
1d570 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 52    }.      if( bR
1d580 65 76 20 26 20 31 20 29 20 77 73 46 6c 61 67 73  ev & 1 ) wsFlags
1d590 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53   |= WHERE_REVERS
1d5a0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
1d5b0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 44   If there is a D
1d5c0 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
1d5d0 72 20 61 6e 64 20 74 68 69 73 20 69 6e 64 65 78  r and this index
1d5e0 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20   will scan rows 
1d5f0 69 6e 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  in.    ** order 
1d600 6f 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  of the DISTINCT 
1d610 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 63 6c 65  expressions, cle
1d620 61 72 20 62 44 69 73 74 20 61 6e 64 20 73 65 74  ar bDist and set
1d630 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
1d640 0a 20 20 20 20 2a 2a 20 66 6c 61 67 73 20 69 6e  .    ** flags in
1d650 20 77 73 46 6c 61 67 73 2e 20 2a 2f 0a 20 20 20   wsFlags. */.   
1d660 20 69 66 28 20 62 44 69 73 74 0a 20 20 20 20 20   if( bDist.     
1d670 26 26 20 69 73 44 69 73 74 69 6e 63 74 49 6e 64  && isDistinctInd
1d680 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
1d690 70 50 72 6f 62 65 2c 20 69 43 75 72 2c 20 70 2d  pProbe, iCur, p-
1d6a0 3e 70 44 69 73 74 69 6e 63 74 2c 20 6e 45 71 29  >pDistinct, nEq)
1d6b0 0a 20 20 20 20 20 26 26 20 28 77 73 46 6c 61 67  .     && (wsFlag
1d6c0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1d6d0 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  _IN)==0.    ){. 
1d6e0 20 20 20 20 20 62 44 69 73 74 20 3d 20 30 3b 0a       bDist = 0;.
1d6f0 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
1d700 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
1d710 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  GE|WHERE_COLUMN_
1d720 52 41 4e 47 45 7c 57 48 45 52 45 5f 44 49 53 54  RANGE|WHERE_DIST
1d730 49 4e 43 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  INCT;.    }..   
1d740 20 2f 2a 20 49 66 20 63 75 72 72 65 6e 74 6c 79   /* If currently
1d750 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 74 68 65   calculating the
1d760 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 61   cost of using a
1d770 6e 20 69 6e 64 65 78 20 28 6e 6f 74 20 74 68 65  n index (not the
1d780 20 49 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65   IPK.    ** inde
1d790 78 29 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  x), determine if
1d7a0 20 61 6c 6c 20 72 65 71 75 69 72 65 64 20 63 6f   all required co
1d7b0 6c 75 6d 6e 20 64 61 74 61 20 6d 61 79 20 62 65  lumn data may be
1d7c0 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75   obtained withou
1d7d0 74 20 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  t .    ** using 
1d7e0 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 28  the main table (
1d7f0 69 2e 65 2e 20 69 66 20 74 68 65 20 69 6e 64 65  i.e. if the inde
1d800 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 0a  x is a covering.
1d810 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72      ** index for
1d820 20 74 68 69 73 20 71 75 65 72 79 29 2e 20 49 66   this query). If
1d830 20 69 74 20 69 73 2c 20 73 65 74 20 74 68 65 20   it is, set the 
1d840 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66  WHERE_IDX_ONLY f
1d850 6c 61 67 20 69 6e 0a 20 20 20 20 2a 2a 20 77 73  lag in.    ** ws
1d860 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65  Flags. Otherwise
1d870 2c 20 73 65 74 20 74 68 65 20 62 4c 6f 6f 6b 75  , set the bLooku
1d880 70 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 72  p variable to tr
1d890 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ue.  */.    if( 
1d8a0 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 42 69  pIdx ){.      Bi
1d8b0 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
1d8c0 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69  colUsed;.      i
1d8d0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
1d8e0 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
1d8f0 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
1d900 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78      int x = pIdx
1d910 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
1d920 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53         if( x<BMS
1d930 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
1d940 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b  m &= ~(((Bitmask
1d950 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20  )1)<<x);.       
1d960 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1d970 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
1d980 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1d990 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
1d9a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d9b0 20 20 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31       bLookup = 1
1d9c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d9d0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45  .    /*.    ** E
1d9e0 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
1d9f0 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75  er of rows of ou
1da00 74 70 75 74 2e 20 20 46 6f 72 20 61 6e 20 22 78  tput.  For an "x
1da10 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22   IN (SELECT...)"
1da20 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69  .    ** constrai
1da30 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  nt, do not let t
1da40 68 65 20 65 73 74 69 6d 61 74 65 20 65 78 63 65  he estimate exce
1da50 65 64 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73  ed half the rows
1da60 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   in the table.. 
1da70 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d     */.    nRow =
1da80 20 28 64 6f 75 62 6c 65 29 28 61 69 52 6f 77 45   (double)(aiRowE
1da90 73 74 5b 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c  st[nEq] * nInMul
1daa0 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73  );.    if( bInEs
1dab0 74 20 26 26 20 6e 52 6f 77 2a 32 3e 61 69 52 6f  t && nRow*2>aiRo
1dac0 77 45 73 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  wEst[0] ){.     
1dad0 20 6e 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74   nRow = aiRowEst
1dae0 5b 30 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e  [0]/2;.      nIn
1daf0 4d 75 6c 20 3d 20 28 69 6e 74 29 28 6e 52 6f 77  Mul = (int)(nRow
1db00 20 2f 20 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d   / aiRowEst[nEq]
1db10 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  );.    }..#ifdef
1db20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1db30 54 41 54 33 0a 20 20 20 20 2f 2a 20 49 66 20 74  TAT3.    /* If t
1db40 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
1db50 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 56   of the form x=V
1db60 41 4c 55 45 20 6f 72 20 78 20 49 4e 20 28 45 31  ALUE or x IN (E1
1db70 2c 45 32 2c 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20  ,E2,...).    ** 
1db80 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20 74 68  and we do not th
1db90 69 6e 6b 20 74 68 61 74 20 76 61 6c 75 65 73 20  ink that values 
1dba0 6f 66 20 78 20 61 72 65 20 75 6e 69 71 75 65 20  of x are unique 
1dbb0 61 6e 64 20 69 66 20 68 69 73 74 6f 67 72 61 6d  and if histogram
1dbc0 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20  .    ** data is 
1dbd0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 63 6f  available for co
1dbe0 6c 75 6d 6e 20 78 2c 20 74 68 65 6e 20 69 74 20  lumn x, then it 
1dbf0 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c  might be possibl
1dc00 65 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20  e.    ** to get 
1dc10 61 20 62 65 74 74 65 72 20 65 73 74 69 6d 61 74  a better estimat
1dc20 65 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  e on the number 
1dc30 6f 66 20 72 6f 77 73 20 62 61 73 65 64 20 6f 6e  of rows based on
1dc40 0a 20 20 20 20 2a 2a 20 56 41 4c 55 45 20 61 6e  .    ** VALUE an
1dc50 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68 61  d how common tha
1dc60 74 20 76 61 6c 75 65 20 69 73 20 61 63 63 6f 72  t value is accor
1dc70 64 69 6e 67 20 74 6f 20 74 68 65 20 68 69 73 74  ding to the hist
1dc80 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  ogram..    */.  
1dc90 20 20 69 66 28 20 6e 52 6f 77 3e 28 64 6f 75 62    if( nRow>(doub
1dca0 6c 65 29 31 20 26 26 20 6e 45 71 3d 3d 31 20 26  le)1 && nEq==1 &
1dcb0 26 20 70 46 69 72 73 74 54 65 72 6d 21 3d 30 20  & pFirstTerm!=0 
1dcc0 26 26 20 61 69 52 6f 77 45 73 74 5b 31 5d 3e 31  && aiRowEst[1]>1
1dcd0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1dce0 28 20 28 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  ( (pFirstTerm->e
1dcf0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
1dd00 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  Q|WO_ISNULL|WO_I
1dd10 4e 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  N))!=0 );.      
1dd20 69 66 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  if( pFirstTerm->
1dd30 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1dd40 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b  EQ|WO_ISNULL) ){
1dd50 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1dd60 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  e( pFirstTerm->e
1dd70 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
1dd80 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1dd90 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d  ase( pFirstTerm-
1dda0 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
1ddb0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
1ddc0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
1ddd0 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62  st(pParse, pProb
1dde0 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 70  e, pFirstTerm->p
1ddf0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
1de00 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Row);.      }els
1de10 65 20 69 66 28 20 62 49 6e 45 73 74 3d 3d 30 20  e if( bInEst==0 
1de20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1de30 74 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  t( pFirstTerm->e
1de40 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20  Operator==WO_IN 
1de50 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
1de60 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
1de70 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73 74  , pProbe, pFirst
1de80 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  Term->pExpr->x.p
1de90 4c 69 73 74 2c 20 26 6e 52 6f 77 29 3b 0a 20 20  List, &nRow);.  
1dea0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
1deb0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1dec0 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 20 20  BLE_STAT3 */..  
1ded0 20 20 2f 2a 20 41 64 6a 75 73 74 20 74 68 65 20    /* Adjust the 
1dee0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
1def0 20 72 6f 77 73 20 61 6e 64 20 64 6f 77 6e 77 61   rows and downwa
1df00 72 64 20 74 6f 20 72 65 66 6c 65 63 74 20 72 6f  rd to reflect ro
1df10 77 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61  ws.    ** that a
1df20 72 65 20 65 78 63 6c 75 64 65 64 20 62 79 20 72  re excluded by r
1df30 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1df40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f  ..    */.    nRo
1df50 77 20 3d 20 6e 52 6f 77 2f 72 61 6e 67 65 44 69  w = nRow/rangeDi
1df60 76 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 3c  v;.    if( nRow<
1df70 31 20 29 20 6e 52 6f 77 20 3d 20 31 3b 0a 0a 20  1 ) nRow = 1;.. 
1df80 20 20 20 2f 2a 20 45 78 70 65 72 69 6d 65 6e 74     /* Experiment
1df90 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c 20 53 51  s run on real SQ
1dfa0 4c 69 74 65 20 64 61 74 61 62 61 73 65 73 20 73  Lite databases s
1dfb0 68 6f 77 20 74 68 61 74 20 74 68 65 20 74 69 6d  how that the tim
1dfc0 65 20 6e 65 65 64 65 64 0a 20 20 20 20 2a 2a 20  e needed.    ** 
1dfd0 74 6f 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73  to do a binary s
1dfe0 65 61 72 63 68 20 74 6f 20 6c 6f 63 61 74 65 20  earch to locate 
1dff0 61 20 72 6f 77 20 69 6e 20 61 20 74 61 62 6c 65  a row in a table
1e000 20 6f 72 20 69 6e 64 65 78 20 69 73 20 72 6f 75   or index is rou
1e010 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f 67 31  ghly.    ** log1
1e020 30 28 4e 29 20 74 69 6d 65 73 20 74 68 65 20 74  0(N) times the t
1e030 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66 72 6f 6d  ime to move from
1e040 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74 68 65 20   one row to the 
1e050 6e 65 78 74 20 72 6f 77 20 77 69 74 68 69 6e 0a  next row within.
1e060 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 6f      ** a table o
1e070 72 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61 63  r index.  The ac
1e080 74 75 61 6c 20 74 69 6d 65 73 20 63 61 6e 20 76  tual times can v
1e090 61 72 79 2c 20 77 69 74 68 20 74 68 65 20 73 69  ary, with the si
1e0a0 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 72 65 63  ze of.    ** rec
1e0b0 6f 72 64 73 20 62 65 69 6e 67 20 61 6e 20 69 6d  ords being an im
1e0c0 70 6f 72 74 61 6e 74 20 66 61 63 74 6f 72 2e 20  portant factor. 
1e0d0 20 42 6f 74 68 20 6d 6f 76 65 73 20 61 6e 64 20   Both moves and 
1e0e0 73 65 61 72 63 68 65 73 20 61 72 65 0a 20 20 20  searches are.   
1e0f0 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69 74 68 20   ** slower with 
1e100 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73 2c 20  larger records, 
1e110 70 72 65 73 75 6d 61 62 6c 79 20 62 65 63 61 75  presumably becau
1e120 73 65 20 66 65 77 65 72 20 72 65 63 6f 72 64 73  se fewer records
1e130 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f 6e 20 6f   fit.    ** on o
1e140 6e 65 20 70 61 67 65 20 61 6e 64 20 68 65 6e 63  ne page and henc
1e150 65 20 6d 6f 72 65 20 70 61 67 65 73 20 68 61 76  e more pages hav
1e160 65 20 74 6f 20 62 65 20 66 65 74 63 68 65 64 2e  e to be fetched.
1e170 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1e180 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1e190 6e 64 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  nd and the sqlit
1e1a0 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71 6c 69  e_stat1 and sqli
1e1b0 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65 73 20  te_stat3 tables 
1e1c0 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 67 69  do.    ** not gi
1e1d0 76 65 20 75 73 20 64 61 74 61 20 6f 6e 20 74 68  ve us data on th
1e1e0 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
1e1f0 20 6f 66 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   of table and in
1e200 64 65 78 20 72 65 63 6f 72 64 73 2e 0a 20 20 20  dex records..   
1e210 20 2a 2a 20 53 6f 20 74 68 69 73 20 63 6f 6d 70   ** So this comp
1e220 75 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  utation assumes 
1e230 74 61 62 6c 65 20 72 65 63 6f 72 64 73 20 61 72  table records ar
1e240 65 20 61 62 6f 75 74 20 74 77 69 63 65 20 61 73  e about twice as
1e250 20 62 69 67 0a 20 20 20 20 2a 2a 20 61 73 20 69   big.    ** as i
1e260 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 20 20 20  ndex records.   
1e270 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 73 46   */.    if( (wsF
1e280 6c 61 67 73 26 7e 57 48 45 52 45 5f 52 45 56 45  lags&~WHERE_REVE
1e290 52 53 45 29 3d 3d 57 48 45 52 45 5f 49 44 58 5f  RSE)==WHERE_IDX_
1e2a0 4f 4e 4c 59 0a 20 20 20 20 20 26 26 20 28 70 57  ONLY.     && (pW
1e2b0 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  C->wctrlFlags & 
1e2c0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
1e2d0 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 26  SIRED)==0.     &
1e2e0 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
1e2f0 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20  onfig.bUseCis.  
1e300 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
1e310 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65  onEnabled(pParse
1e320 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
1e330 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 29  erIdxScan).    )
1e340 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1e350 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 73 65  index is not use
1e360 66 75 6c 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ful for indexing
1e370 2c 20 62 75 74 20 69 74 20 69 73 20 61 20 63 6f  , but it is a co
1e380 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  vering index..  
1e390 20 20 20 20 2a 2a 20 41 20 66 75 6c 6c 2d 73 63      ** A full-sc
1e3a0 61 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  an of the index 
1e3b0 6d 69 67 68 74 20 62 65 20 61 20 6c 69 74 74 6c  might be a littl
1e3c0 65 20 66 61 73 74 65 72 20 74 68 61 6e 20 61 20  e faster than a 
1e3d0 66 75 6c 6c 2d 73 63 61 6e 0a 20 20 20 20 20 20  full-scan.      
1e3e0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c  ** of the table,
1e3f0 20 73 6f 20 67 69 76 65 20 74 68 69 73 20 63 61   so give this ca
1e400 73 65 20 61 20 63 6f 73 74 20 73 6c 69 67 68 74  se a cost slight
1e410 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 61 20 74  ly less than a t
1e420 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 63  able.      ** sc
1e430 61 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 73  an. */.      cos
1e440 74 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a  t = aiRowEst[0]*
1e450 33 20 2b 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  3 + pProbe->nCol
1e460 75 6d 6e 3b 0a 20 20 20 20 20 20 77 73 46 6c 61  umn;.      wsFla
1e470 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 56 45  gs |= WHERE_COVE
1e480 52 5f 53 43 41 4e 7c 57 48 45 52 45 5f 43 4f 4c  R_SCAN|WHERE_COL
1e490 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 7d  UMN_RANGE;.    }
1e4a0 65 6c 73 65 20 69 66 28 20 28 77 73 46 6c 61 67  else if( (wsFlag
1e4b0 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
1e4c0 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20  LLSCAN)==0 ){.  
1e4d0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
1e4e0 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
1e4f0 73 63 61 6e 20 69 73 20 61 20 6e 75 6d 62 65 72  scan is a number
1e500 20 6f 66 20 6d 6f 76 65 20 6f 70 65 72 61 74 69   of move operati
1e510 6f 6e 73 20 65 71 75 61 6c 0a 20 20 20 20 20 20  ons equal.      
1e520 2a 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ** to the number
1e530 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1e540 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  table..      **.
1e550 20 20 20 20 20 20 2a 2a 20 57 65 20 61 64 64 20        ** We add 
1e560 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 34 78  an additional 4x
1e570 20 70 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c   penalty to full
1e580 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 20 20 54   table scans.  T
1e590 68 69 73 20 63 61 75 73 65 73 0a 20 20 20 20 20  his causes.     
1e5a0 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 66 75 6e   ** the cost fun
1e5b0 63 74 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20  ction to err on 
1e5c0 74 68 65 20 73 69 64 65 20 6f 66 20 63 68 6f 6f  the side of choo
1e5d0 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f 76  sing an index ov
1e5e0 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f  er.      ** choo
1e5f0 73 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e  sing a full scan
1e600 2e 20 20 54 68 69 73 20 34 78 20 66 75 6c 6c 2d  .  This 4x full-
1e610 73 63 61 6e 20 70 65 6e 61 6c 74 79 20 69 73 20  scan penalty is 
1e620 61 6e 20 61 72 67 75 61 62 6c 65 0a 20 20 20 20  an arguable.    
1e630 20 20 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e    ** decision an
1e640 64 20 6f 6e 65 20 77 68 69 63 68 20 77 65 20 65  d one which we e
1e650 78 70 65 63 74 20 74 6f 20 72 65 76 69 73 69 74  xpect to revisit
1e660 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1e670 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 74   But.      ** it
1e680 20 73 65 65 6d 73 20 74 6f 20 62 65 20 77 6f 72   seems to be wor
1e690 6b 69 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68  king well enough
1e6a0 20 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a   at the moment..
1e6b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1e6c0 6f 73 74 20 3d 20 61 69 52 6f 77 45 73 74 5b 30  ost = aiRowEst[0
1e6d0 5d 2a 34 3b 0a 20 20 20 20 20 20 77 73 46 6c 61  ]*4;.      wsFla
1e6e0 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58  gs &= ~WHERE_IDX
1e6f0 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _ONLY;.    }else
1e700 7b 0a 20 20 20 20 20 20 6c 6f 67 31 30 4e 20 3d  {.      log10N =
1e710 20 65 73 74 4c 6f 67 28 61 69 52 6f 77 45 73 74   estLog(aiRowEst
1e720 5b 30 5d 29 3b 0a 20 20 20 20 20 20 63 6f 73 74  [0]);.      cost
1e730 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69   = nRow;.      i
1e740 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
1e750 20 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70 20 29     if( bLookup )
1e760 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  {.          /* F
1e770 6f 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f 6f 6b  or an index look
1e780 75 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  up followed by a
1e790 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a 20   table lookup:. 
1e7a0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e           **    n
1e7b0 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72  InMul index sear
1e7c0 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65  ches to find the
1e7d0 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 69   start of each i
1e7e0 6e 64 65 78 20 72 61 6e 67 65 0a 20 20 20 20 20  ndex range.     
1e7f0 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
1e800 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68  steps through th
1e810 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
1e820 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61 62    **  + nRow tab
1e830 6c 65 20 73 65 61 72 63 68 65 73 20 74 6f 20 6c  le searches to l
1e840 6f 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65 20  ookup the table 
1e850 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
1e860 72 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20  rowid.          
1e870 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73  */.          cos
1e880 74 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20 2b 20 6e  t += (nInMul + n
1e890 52 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20  Row)*log10N;.   
1e8a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e8b0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63        /* For a c
1e8c0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 3a 0a 20  overing index:. 
1e8d0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20           **     
1e8e0 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61  nInMul index sea
1e8f0 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68  rches to find th
1e900 65 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20  e initial entry 
1e910 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
1e920 2b 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72  + nRow steps thr
1e930 6f 75 67 68 20 74 68 65 20 69 6e 64 65 78 0a 20  ough the index. 
1e940 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1e950 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 49        cost += nI
1e960 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20  nMul*log10N;.   
1e970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1e980 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46  se{.        /* F
1e990 6f 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d 61  or a rowid prima
1e9a0 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a 20  ry key lookup:. 
1e9b0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e         **    nIn
1e9c0 4d 75 6c 74 20 74 61 62 6c 65 20 73 65 61 72 63  Mult table searc
1e9d0 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  hes to find the 
1e9e0 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 66 6f  initial entry fo
1e9f0 72 20 65 61 63 68 20 72 61 6e 67 65 0a 20 20 20  r each range.   
1ea00 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
1ea10 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68  steps through th
1ea20 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  e table.        
1ea30 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20  */.        cost 
1ea40 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e  += nInMul*log10N
1ea50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ea60 0a 20 20 20 20 2f 2a 20 41 64 64 20 69 6e 20 74  .    /* Add in t
1ea70 68 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73  he estimated cos
1ea80 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65  t of sorting the
1ea90 20 72 65 73 75 6c 74 2e 20 20 41 63 74 75 61 6c   result.  Actual
1eaa0 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a 20 20   experimental.  
1eab0 20 20 2a 2a 20 6d 65 61 73 75 72 65 6d 65 6e 74    ** measurement
1eac0 73 20 6f 66 20 73 6f 72 74 69 6e 67 20 70 65 72  s of sorting per
1ead0 66 6f 72 6d 61 6e 63 65 20 69 6e 20 53 51 4c 69  formance in SQLi
1eae0 74 65 20 73 68 6f 77 20 74 68 61 74 20 73 6f 72  te show that sor
1eaf0 74 69 6e 67 20 74 69 6d 65 0a 20 20 20 20 2a 2a  ting time.    **
1eb00 20 61 64 64 73 20 43 2a 4e 2a 6c 6f 67 31 30 28   adds C*N*log10(
1eb10 4e 29 20 74 6f 20 74 68 65 20 63 6f 73 74 2c 20  N) to the cost, 
1eb20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
1eb30 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f  umber of rows to
1eb40 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 6f 72 74   be .    ** sort
1eb50 65 64 20 61 6e 64 20 43 20 69 73 20 61 20 66 61  ed and C is a fa
1eb60 63 74 6f 72 20 62 65 74 77 65 65 6e 20 31 2e 39  ctor between 1.9
1eb70 35 20 61 6e 64 20 34 2e 33 2e 20 20 57 65 20 77  5 and 4.3.  We w
1eb80 69 6c 6c 20 73 70 6c 69 74 20 74 68 65 0a 20 20  ill split the.  
1eb90 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 63 65 20    ** difference 
1eba0 61 6e 64 20 73 65 6c 65 63 74 20 43 20 6f 66 20  and select C of 
1ebb0 33 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  3.0..    */.    
1ebc0 69 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20 20  if( bSort ){.   
1ebd0 20 20 20 63 6f 73 74 20 2b 3d 20 6e 52 6f 77 2a     cost += nRow*
1ebe0 65 73 74 4c 6f 67 28 6e 52 6f 77 2a 28 6e 4f 72  estLog(nRow*(nOr
1ebf0 64 65 72 42 79 20 2d 20 6e 4f 42 53 61 74 29 2f  derBy - nOBSat)/
1ec00 6e 4f 72 64 65 72 42 79 29 2a 33 3b 0a 20 20 20  nOrderBy)*3;.   
1ec10 20 7d 0a 20 20 20 20 69 66 28 20 62 44 69 73 74   }.    if( bDist
1ec20 20 29 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b   ){.      cost +
1ec30 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52  = nRow*estLog(nR
1ec40 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a 20 20  ow)*3;.    }..  
1ec50 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20    /**** Cost of 
1ec60 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64 65 78  using this index
1ec70 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f   has now been co
1ec80 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20  mputed ****/..  
1ec90 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1eca0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e  e additional con
1ecb0 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 69 73  straints on this
1ecc0 20 74 61 62 6c 65 20 74 68 61 74 20 63 61 6e 6e   table that cann
1ecd0 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65  ot.    ** be use
1ece0 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  d with the curre
1ecf0 6e 74 20 69 6e 64 65 78 2c 20 62 75 74 20 77 68  nt index, but wh
1ed00 69 63 68 20 6d 69 67 68 74 20 6c 6f 77 65 72 20  ich might lower 
1ed10 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a  the number.    *
1ed20 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  * of output rows
1ed30 2c 20 61 64 6a 75 73 74 20 74 68 65 20 6e 52 6f  , adjust the nRo
1ed40 77 20 76 61 6c 75 65 20 61 63 63 6f 72 64 69 6e  w value accordin
1ed50 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  gly.  This only 
1ed60 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 73 20  .    ** matters 
1ed70 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  if the current i
1ed80 6e 64 65 78 20 69 73 20 74 68 65 20 6c 65 61 73  ndex is the leas
1ed90 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20  t costly, so do 
1eda0 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20 20 20 2a  not bother.    *
1edb0 2a 20 77 69 74 68 20 74 68 69 73 20 73 74 65 70  * with this step
1edc0 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 6b   if we already k
1edd0 6e 6f 77 20 74 68 69 73 20 69 6e 64 65 78 20 77  now this index w
1ede0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f 73 65  ill not be chose
1edf0 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  n..    ** Also, 
1ee00 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
1ee10 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e   output row coun
1ee20 74 20 62 65 6c 6f 77 20 32 20 75 73 69 6e 67 20  t below 2 using 
1ee30 74 68 69 73 20 73 74 65 70 2e 0a 20 20 20 20 2a  this step..    *
1ee40 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69 73 20 63  *.    ** It is c
1ee50 72 69 74 69 63 61 6c 20 74 68 61 74 20 74 68 65  ritical that the
1ee60 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b 20 62   notValid mask b
1ee70 65 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74  e used here inst
1ee80 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ead of.    ** th
1ee90 65 20 6e 6f 74 52 65 61 64 79 20 6d 61 73 6b 2e  e notReady mask.
1eea0 20 20 57 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67    When computing
1eeb0 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 69 6e   an "optimal" in
1eec0 64 65 78 2c 20 74 68 65 20 6e 6f 74 52 65 61 64  dex, the notRead
1eed0 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b 20 77 69  y.    ** mask wi
1eee0 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20 6f 6e 65  ll only have one
1eef0 20 62 69 74 20 73 65 74 20 2d 20 74 68 65 20 62   bit set - the b
1ef00 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  it for the curre
1ef10 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  nt table..    **
1ef20 20 54 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61   The notValid ma
1ef30 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  sk, on the other
1ef40 20 68 61 6e 64 2c 20 61 6c 77 61 79 73 20 68 61   hand, always ha
1ef50 73 20 61 6c 6c 20 62 69 74 73 20 73 65 74 20 66  s all bits set f
1ef60 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  or.    ** tables
1ef70 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 69 6e   that are not in
1ef80 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20 20 49   outer loops.  I
1ef90 66 20 6e 6f 74 52 65 61 64 79 20 69 73 20 75 73  f notReady is us
1efa0 65 64 20 68 65 72 65 20 69 6e 73 74 65 61 64 0a  ed here instead.
1efb0 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c      ** of notVal
1efc0 69 64 2c 20 74 68 65 6e 20 61 20 6f 70 74 69 6d  id, then a optim
1efd0 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 64 65  al index that de
1efe0 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65 72 20 6a  pends on inner j
1eff0 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20 20 20 2a  oins loops.    *
1f000 2a 20 6d 69 67 68 74 20 62 65 20 73 65 6c 65 63  * might be selec
1f010 74 65 64 20 65 76 65 6e 20 77 68 65 6e 20 74 68  ted even when th
1f020 65 72 65 20 65 78 69 73 74 73 20 61 6e 20 6f 70  ere exists an op
1f030 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74  timal index that
1f040 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 73   has.    ** no s
1f050 75 63 68 20 64 65 70 65 6e 64 65 6e 63 79 2e 0a  uch dependency..
1f060 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1f070 52 6f 77 3e 32 20 26 26 20 63 6f 73 74 3c 3d 70  Row>2 && cost<=p
1f080 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a  ->cost.rCost ){.
1f090 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1f0c0 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
1f0d0 6e 53 6b 69 70 45 71 20 3d 20 6e 45 71 3b 20 20  nSkipEq = nEq;  
1f0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f0f0 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61  er of == constra
1f100 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  ints to skip */.
1f110 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 52        int nSkipR
1f120 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20  ange = nBound;  
1f130 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f140 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  < constraints to
1f150 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 42   skip */.      B
1f160 69 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b 20  itmask thisTab; 
1f170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1f180 69 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20 2a  itmap for pSrc *
1f190 2f 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61 62  /..      thisTab
1f1a0 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e   = getMask(pWC->
1f1b0 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
1f1c0 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
1f1d0 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e  =pWC->a, k=pWC->
1f1e0 6e 54 65 72 6d 3b 20 6e 52 6f 77 3e 32 20 26 26  nTerm; nRow>2 &&
1f1f0 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b   k; k--, pTerm++
1f200 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1f210 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1f220 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 63  TERM_VIRTUAL ) c
1f230 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1f240 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1f250 72 65 71 41 6c 6c 20 26 20 70 2d 3e 6e 6f 74 56  reqAll & p->notV
1f260 61 6c 69 64 29 21 3d 74 68 69 73 54 61 62 20 29  alid)!=thisTab )
1f270 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f280 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
1f290 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
1f2a0 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
1f2b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
1f2c0 66 28 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20  f( nSkipEq ){.  
1f2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e            /* Ign
1f2e0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6e 45  ore the first nE
1f2f0 71 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68  q equality match
1f300 65 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64  es since the ind
1f310 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ex.            *
1f320 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63  * has already ac
1f330 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73  counted for thes
1f340 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1f350 20 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20   nSkipEq--;.    
1f360 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f370 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
1f380 6d 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e  me each addition
1f390 61 6c 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63  al equality matc
1f3a0 68 20 72 65 64 75 63 65 73 20 74 68 65 20 72 65  h reduces the re
1f3b0 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20  sult.           
1f3c0 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20   ** set size by 
1f3d0 61 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a  a factor of 10 *
1f3e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 52  /.            nR
1f3f0 6f 77 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20  ow /= 10;.      
1f400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1f410 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
1f420 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
1f430 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
1f440 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _GE) ){.        
1f450 20 20 69 66 28 20 6e 53 6b 69 70 52 61 6e 67 65    if( nSkipRange
1f460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f470 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69  /* Ignore the fi
1f480 72 73 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 72  rst nSkipRange r
1f490 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1f4a0 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78   since the index
1f4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1f4c0 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f  has already acco
1f4d0 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20  unted for these 
1f4e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
1f4f0 53 6b 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20  SkipRange--;.   
1f500 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
1f520 75 6d 65 20 65 61 63 68 20 61 64 64 69 74 69 6f  ume each additio
1f530 6e 61 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  nal range constr
1f540 61 69 6e 74 20 72 65 64 75 63 65 73 20 74 68 65  aint reduces the
1f550 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20   result.        
1f560 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20      ** set size 
1f570 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33  by a factor of 3
1f580 2e 20 20 49 6e 64 65 78 65 64 20 72 61 6e 67 65  .  Indexed range
1f590 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 64   constraints red
1f5a0 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  uce.            
1f5b0 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ** the search sp
1f5c0 61 63 65 20 62 79 20 61 20 6c 61 72 67 65 72 20  ace by a larger 
1f5d0 66 61 63 74 6f 72 3a 20 34 2e 20 20 57 65 20 6d  factor: 4.  We m
1f5e0 61 6b 65 20 69 6e 64 65 78 65 64 20 72 61 6e 67  ake indexed rang
1f5f0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1f600 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 20   more selective 
1f610 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c 79 20 62 65  intentionally be
1f620 63 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  cause of the sub
1f630 6a 65 63 74 69 76 65 20 0a 20 20 20 20 20 20 20  jective .       
1f640 20 20 20 20 20 2a 2a 20 6f 62 73 65 72 76 61 74       ** observat
1f650 69 6f 6e 20 74 68 61 74 20 69 6e 64 65 78 65 64  ion that indexed
1f660 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1f670 74 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 6f  ts really are mo
1f680 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
1f690 2a 20 73 65 6c 65 63 74 69 76 65 20 69 6e 20 70  * selective in p
1f6a0 72 61 63 74 69 63 65 2c 20 6f 6e 20 61 76 65 72  ractice, on aver
1f6b0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
1f6c0 20 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20      nRow /= 3;. 
1f6d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f6e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
1f6f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
1f700 4f 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  O_NOOP ){.      
1f710 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72      /* Any other
1f720 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65   expression lowe
1f730 72 73 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  rs the output ro
1f740 77 20 63 6f 75 6e 74 20 62 79 20 68 61 6c 66 20  w count by half 
1f750 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 52 6f  */.          nRo
1f760 77 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  w /= 2;.        
1f770 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1f780 69 66 28 20 6e 52 6f 77 3c 32 20 29 20 6e 52 6f  if( nRow<2 ) nRo
1f790 77 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20  w = 2;.    }... 
1f7a0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 0a     WHERETRACE((.
1f7b0 20 20 20 20 20 20 22 25 73 28 25 73 29 3a 5c 6e        "%s(%s):\n
1f7c0 22 0a 20 20 20 20 20 20 22 20 20 20 20 6e 45 71  ".      "    nEq
1f7d0 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 72 61  =%d nInMul=%d ra
1f7e0 6e 67 65 44 69 76 3d 25 64 20 62 53 6f 72 74 3d  ngeDiv=%d bSort=
1f7f0 25 64 20 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73  %d bLookup=%d ws
1f800 46 6c 61 67 73 3d 30 78 25 30 38 78 5c 6e 22 0a  Flags=0x%08x\n".
1f810 20 20 20 20 20 20 22 20 20 20 20 6e 6f 74 52 65        "    notRe
1f820 61 64 79 3d 30 78 25 6c 6c 78 20 6c 6f 67 31 30  ady=0x%llx log10
1f830 4e 3d 25 2e 31 66 20 6e 52 6f 77 3d 25 2e 31 66  N=%.1f nRow=%.1f
1f840 20 63 6f 73 74 3d 25 2e 31 66 5c 6e 22 0a 20 20   cost=%.1f\n".  
1f850 20 20 20 20 22 20 20 20 20 75 73 65 64 3d 30 78      "    used=0x
1f860 25 6c 6c 78 20 6e 4f 72 64 65 72 65 64 3d 25 64  %llx nOrdered=%d
1f870 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c 0a 20   nOBSat=%d\n",. 
1f880 20 20 20 20 20 70 53 72 63 2d 3e 70 54 61 62 2d       pSrc->pTab-
1f890 3e 7a 4e 61 6d 65 2c 20 28 70 49 64 78 20 3f 20  >zName, (pIdx ? 
1f8a0 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69  pIdx->zName : "i
1f8b0 70 6b 22 29 2c 20 0a 20 20 20 20 20 20 6e 45 71  pk"), .      nEq
1f8c0 2c 20 6e 49 6e 4d 75 6c 2c 20 28 69 6e 74 29 72  , nInMul, (int)r
1f8d0 61 6e 67 65 44 69 76 2c 20 62 53 6f 72 74 2c 20  angeDiv, bSort, 
1f8e0 62 4c 6f 6f 6b 75 70 2c 20 77 73 46 6c 61 67 73  bLookup, wsFlags
1f8f0 2c 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 74 52 65  ,.      p->notRe
1f900 61 64 79 2c 20 6c 6f 67 31 30 4e 2c 20 6e 52 6f  ady, log10N, nRo
1f910 77 2c 20 63 6f 73 74 2c 20 75 73 65 64 2c 20 6e  w, cost, used, n
1f920 4f 72 64 65 72 65 64 2c 20 6e 4f 42 53 61 74 0a  Ordered, nOBSat.
1f930 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a 20      ));..    /* 
1f940 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  If this index is
1f950 20 74 68 65 20 62 65 73 74 20 77 65 20 68 61 76   the best we hav
1f960 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c 20 74  e seen so far, t
1f970 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69 73 0a  hen record this.
1f980 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64      ** index and
1f990 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74 68 65   its cost in the
1f9a0 20 70 43 6f 73 74 20 73 74 72 75 63 74 75 72 65   pCost structure
1f9b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f9c0 20 28 21 70 49 64 78 20 7c 7c 20 77 73 46 6c 61   (!pIdx || wsFla
1f9d0 67 73 29 0a 20 20 20 20 20 26 26 20 28 63 6f 73  gs).     && (cos
1f9e0 74 3c 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20  t<p->cost.rCost 
1f9f0 7c 7c 20 28 63 6f 73 74 3c 3d 70 2d 3e 63 6f 73  || (cost<=p->cos
1fa00 74 2e 72 43 6f 73 74 20 26 26 20 6e 52 6f 77 3c  t.rCost && nRow<
1fa10 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f  p->cost.plan.nRo
1fa20 77 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  w)).    ){.     
1fa30 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d   p->cost.rCost =
1fa40 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 2d 3e   cost;.      p->
1fa50 63 6f 73 74 2e 75 73 65 64 20 3d 20 75 73 65 64  cost.used = used
1fa60 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e  ;.      p->cost.
1fa70 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77  plan.nRow = nRow
1fa80 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e  ;.      p->cost.
1fa90 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 28  plan.wsFlags = (
1faa0 77 73 46 6c 61 67 73 26 77 73 46 6c 61 67 4d 61  wsFlags&wsFlagMa
1fab0 73 6b 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f  sk);.      p->co
1fac0 73 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 45  st.plan.nEq = nE
1fad0 71 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  q;.      p->cost
1fae0 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 6e  .plan.nOBSat = n
1faf0 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 70 2d 3e  OBSat;.      p->
1fb00 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
1fb10 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a 0a   = pIdx;.    }..
1fb20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1fb30 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
1fb40 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f  Y clause, then o
1fb50 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64  nly that one ind
1fb60 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ex is.    ** con
1fb70 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20  sidered. */.    
1fb80 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
1fb90 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
1fba0 2a 20 52 65 73 65 74 20 6d 61 73 6b 73 20 66 6f  * Reset masks fo
1fbb0 72 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  r the next index
1fbc0 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   in the loop */.
1fbd0 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d      wsFlagMask =
1fbe0 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   ~(WHERE_ROWID_E
1fbf0 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
1fc00 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d  NGE);.    eqTerm
1fc10 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d  Mask = idxEqTerm
1fc20 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Mask;.  }..  /* 
1fc30 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
1fc40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1fc50 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65  nd the SQLITE_Re
1fc60 76 65 72 73 65 4f 72 64 65 72 20 66 6c 61 67 0a  verseOrder flag.
1fc70 20 20 2a 2a 20 69 73 20 73 65 74 2c 20 74 68 65    ** is set, the
1fc80 6e 20 72 65 76 65 72 73 65 20 74 68 65 20 6f 72  n reverse the or
1fc90 64 65 72 20 74 68 61 74 20 74 68 65 20 69 6e 64  der that the ind
1fca0 65 78 20 77 69 6c 6c 20 62 65 20 73 63 61 6e 6e  ex will be scann
1fcb0 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54 68 69 73  ed.  ** in. This
1fcc0 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 70 70   is used for app
1fcd0 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e 67  lication testing
1fce0 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e 64 20 63  , to help find c
1fcf0 61 73 65 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  ases.  ** where 
1fd00 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 65 68 61  application beha
1fd10 76 69 6f 75 72 20 64 65 70 65 6e 64 73 20 6f 6e  viour depends on
1fd20 20 74 68 65 20 28 75 6e 64 65 66 69 6e 65 64 29   the (undefined)
1fd30 20 6f 72 64 65 72 20 74 68 61 74 0a 20 20 2a 2a   order that.  **
1fd40 20 53 51 4c 69 74 65 20 6f 75 74 70 75 74 73 20   SQLite outputs 
1fd50 72 6f 77 73 20 69 6e 20 69 6e 20 74 68 65 20 61  rows in in the a
1fd60 62 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f 52 44  bsence of an ORD
1fd70 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 2a  ER BY clause.  *
1fd80 2f 0a 20 20 69 66 28 20 21 70 2d 3e 70 4f 72 64  /.  if( !p->pOrd
1fd90 65 72 42 79 20 26 26 20 70 50 61 72 73 65 2d 3e  erBy && pParse->
1fda0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1fdb0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20  TE_ReverseOrder 
1fdc0 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70  ){.    p->cost.p
1fdd0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
1fde0 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
1fdf0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  }..  assert( p->
1fe00 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 2d 3e  pOrderBy || (p->
1fe10 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
1fe20 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29  s&WHERE_ORDERBY)
1fe30 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1fe40 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e   p->cost.plan.u.
1fe50 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70 2d 3e 63  pIdx==0 || (p->c
1fe60 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
1fe70 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29  &WHERE_ROWID_EQ)
1fe80 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1fe90 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30   pSrc->pIndex==0
1fea0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 63   .       || p->c
1feb0 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  ost.plan.u.pIdx=
1fec0 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  =0 .       || p-
1fed0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64  >cost.plan.u.pId
1fee0 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  x==pSrc->pIndex 
1fef0 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45 54 52  .  );..  WHERETR
1ff00 41 43 45 28 28 22 62 65 73 74 20 69 6e 64 65 78  ACE(("best index
1ff10 20 69 73 3a 20 25 73 5c 6e 22 2c 20 0a 20 20 20   is: %s\n", .   
1ff20 20 28 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e   ((p->cost.plan.
1ff30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ff40 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
1ff50 20 3f 20 22 6e 6f 6e 65 22 20 3a 20 0a 20 20 20   ? "none" : .   
1ff60 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c        p->cost.pl
1ff70 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70 2d 3e 63  an.u.pIdx ? p->c
1ff80 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  ost.plan.u.pIdx-
1ff90 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 0a  >zName : "ipk").
1ffa0 20 20 29 29 3b 0a 20 20 0a 20 20 62 65 73 74 4f    ));.  .  bestO
1ffb0 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70 29 3b  rClauseIndex(p);
1ffc0 0a 20 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63  .  bestAutomatic
1ffd0 49 6e 64 65 78 28 70 29 3b 0a 20 20 70 2d 3e 63  Index(p);.  p->c
1ffe0 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
1fff0 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a   |= eqTermMask;.
20000 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
20010 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72  e query plan for
20020 20 61 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65   accessing table
20030 20 70 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69   pSrc->pTab. Wri
20040 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71  te the.** best q
20050 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74  uery plan and it
20060 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20  s cost into the 
20070 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74  WhereCost object
20080 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73   supplied .** as
20090 20 74 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65   the last parame
200a0 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
200b0 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65  on may calculate
200c0 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20   the cost of.** 
200d0 62 6f 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69  both real and vi
200e0 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e  rtual table scan
200f0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  s..**.** This fu
20100 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
20110 74 61 6b 65 20 4f 52 44 45 52 20 42 59 20 6f 72  take ORDER BY or
20120 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 61   DISTINCT into a
20130 63 63 6f 75 6e 74 2e 20 20 4e 6f 72 0a 2a 2a 20  ccount.  Nor.** 
20140 64 6f 65 73 20 69 74 20 72 65 6d 65 6d 62 65 72  does it remember
20150 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
20160 6c 65 20 71 75 65 72 79 20 70 6c 61 6e 2e 20 20  le query plan.  
20170 41 6c 6c 20 69 74 20 64 6f 65 73 20 69 73 20 63  All it does is c
20180 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 63 6f  ompute.** the co
20190 73 74 20 77 68 69 6c 65 20 64 65 74 65 72 6d 69  st while determi
201a0 6e 69 6e 67 20 69 66 20 61 6e 20 4f 52 20 6f 70  ning if an OR op
201b0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 70  timization is ap
201c0 70 6c 69 63 61 62 6c 65 2e 20 20 54 68 65 0a 2a  plicable.  The.*
201d0 2a 20 64 65 74 61 69 6c 73 20 77 69 6c 6c 20 62  * details will b
201e0 65 20 72 65 63 6f 6e 73 69 64 65 72 65 64 20 6c  e reconsidered l
201f0 61 74 65 72 20 69 66 20 74 68 65 20 6f 70 74 69  ater if the opti
20200 6d 69 7a 61 74 69 6f 6e 20 69 73 20 66 6f 75 6e  mization is foun
20210 64 20 74 6f 20 62 65 0a 2a 2a 20 61 70 70 6c 69  d to be.** appli
20220 63 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cable..*/.static
20230 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28   void bestIndex(
20240 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29  WhereBestIdx *p)
20250 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
20260 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
20270 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
20280 61 6c 28 70 2d 3e 70 53 72 63 2d 3e 70 54 61 62  al(p->pSrc->pTab
20290 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
202a0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
202b0 78 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 70  xInfo = 0;.    p
202c0 2d 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20 26 70  ->ppIdxInfo = &p
202d0 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 62 65 73  IdxInfo;.    bes
202e0 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 29  tVirtualIndex(p)
202f0 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
20300 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
20310 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73 71  xStr ){.      sq
20320 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
20330 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
20340 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
20350 62 46 72 65 65 28 70 2d 3e 70 50 61 72 73 65 2d  bFree(p->pParse-
20360 3e 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  >db, pIdxInfo);.
20370 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
20380 20 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65 65   {.    bestBtree
20390 49 6e 64 65 78 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Index(p);.  }.}.
203a0 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
203b0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
203c0 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
203d0 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
203e0 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
203f0 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
20400 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
20410 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
20420 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
20430 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
20440 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
20450 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
20460 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
20470 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
20480 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
20490 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
204a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
204b0 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
204c0 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
204d0 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
204e0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
204f0 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
20500 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
20510 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
20520 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
20530 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
20540 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
20550 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
20560 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
20570 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
20580 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
20590 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
205a0 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
205b0 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
205c0 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
205d0 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
205e0 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
205f0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
20600 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
20610 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
20620 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  .**.** IMPLEMENT
20630 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35 39  ATION-OF: R-2459
20640 37 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74 73  7-58655 No tests
20650 20 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74 65   are done for te
20660 72 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  rms that are.** 
20670 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69 73  completely satis
20680 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 2e  fied by indices.
20690 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
206a0 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
206b0 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
206c0 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
206d0 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
206e0 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
206f0 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
20700 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
20710 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
20720 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
20730 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
20740 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
20750 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
20760 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
20770 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
20780 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
20790 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
207a0 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
207b0 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
207c0 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
207d0 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
207e0 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
207f0 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
20800 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
20810 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
20820 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
20830 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
20840 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
20850 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
20860 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
20870 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
20880 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
20890 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
208a0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
208b0 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
208c0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77      && (pTerm->w
208d0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
208e0 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  DED)==0.      &&
208f0 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
20900 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
20910 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
20920 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
20930 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70  oin)).  ){.    p
20940 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
20950 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
20960 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72   if( pTerm->iPar
20970 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent>=0 ){.      
20980 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
20990 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d  r = &pTerm->pWC-
209a0 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  >a[pTerm->iParen
209b0 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d  t];.      if( (-
209c0 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29  -pOther->nChild)
209d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
209e0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
209f0 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20  l, pOther);.    
20a00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
20a10 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
20a20 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
20a30 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63  e to apply the c
20a40 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
20a50 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f  tring zAff.** to
20a60 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72 73   the n registers
20a70 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61 73   starting at bas
20a80 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20  e. .**.** As an 
20a90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51  optimization, SQ
20aa0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
20ab0 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72 65  tries (which are
20ac0 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a   no-ops) at the.
20ad0 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  ** beginning and
20ae0 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65   end of zAff are
20af0 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c   ignored.  If al
20b00 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66  l entries in zAf
20b10 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  f are.** SQLITE_
20b20 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e  AFF_NONE, then n
20b30 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65  o code gets gene
20b40 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rated..**.** Thi
20b50 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  s routine makes 
20b60 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
20b70 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68 65  zAff so that the
20b80 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a   caller is free.
20b90 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66  ** to modify zAf
20ba0 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75  f after this rou
20bb0 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f  tine returns..*/
20bc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
20bd0 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50  eApplyAffinity(P
20be0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
20bf0 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63  t base, int n, c
20c00 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64  har *zAff){.  Vd
20c10 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
20c20 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66  pVdbe;.  if( zAf
20c30 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
20c40 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
20c50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
20c60 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
20c70 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
20c80 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62  ;..  /* Adjust b
20c90 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69  ase and n to ski
20ca0 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46  p over SQLITE_AF
20cb0 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61  F_NONE entries a
20cc0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
20cd0 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20    ** and end of 
20ce0 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
20cf0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ing..  */.  whil
20d00 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30  e( n>0 && zAff[0
20d10 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ]==SQLITE_AFF_NO
20d20 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20  NE ){.    n--;. 
20d30 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a     base++;.    z
20d40 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69  Aff++;.  }.  whi
20d50 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b  le( n>1 && zAff[
20d60 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46  n-1]==SQLITE_AFF
20d70 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d  _NONE ){.    n--
20d80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65  ;.  }..  /* Code
20d90 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79   the OP_Affinity
20da0 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72 65   opcode if there
20db0 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66   is anything lef
20dc0 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66  t to do. */.  if
20dd0 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( n>0 ){.    sql
20de0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20df0 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62  , OP_Affinity, b
20e00 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  ase, n);.    sql
20e10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
20e20 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29  (v, -1, zAff, n)
20e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
20e40 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
20e50 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73  ange(pParse, bas
20e60 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  e, n);.  }.}.../
20e70 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
20e80 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
20e90 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66  equality term of
20ea0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
20eb0 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a  e.  An equality.
20ec0 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65  ** term can be e
20ed0 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20  ither X=expr or 
20ee0 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54  X IN (...).   pT
20ef0 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20  erm is the term 
20f00 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e  to be .** coded.
20f10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
20f20 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  nt value for the
20f30 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c   constraint is l
20f40 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
20f50 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iReg..**.** For 
20f60 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
20f70 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c  the form X=expr,
20f80 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
20f90 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  is evaluated and
20fa0 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69   its.** result i
20fb0 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74  s left on the st
20fc0 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72  ack.  For constr
20fd0 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  aints of the for
20fe0 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20  m X IN (...).** 
20ff0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
21000 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74  s up a loop that
21010 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76   will iterate ov
21020 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
21030 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   X..*/.static in
21040 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  t codeEqualityTe
21050 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
21060 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
21070 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
21080 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
21090 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65  *pTerm,   /* The
210a0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
210b0 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
210c0 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
210d0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f  Level *pLevel, /
210e0 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20  * When level of 
210f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
21100 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
21110 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  n */.  int iTarg
21120 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
21130 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
21140 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
21150 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
21160 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
21170 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
21180 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
21190 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
211c0 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
211d0 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
211e0 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
211f0 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20  ->op==TK_EQ ){. 
21200 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
21210 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
21220 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
21230 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
21240 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
21250 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
21260 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
21270 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
21280 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
21290 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
212a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
212b0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
212c0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
212d0 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
212e0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
212f0 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61  oop *pIn;..    a
21300 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
21310 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67  K_IN );.    iReg
21320 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
21330 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
21340 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
21350 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69  e, pX, 0);.    i
21360 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
21370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
21380 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
21390 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
213a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
213b0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
213c0 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
213d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
213e0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20  el->u.in.nIn==0 
213f0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
21400 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
21410 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21420 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  v);.    }.    pL
21430 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b  evel->u.in.nIn++
21440 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  ;.    pLevel->u.
21450 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20  in.aInLoop =.   
21460 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
21470 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
21480 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  e->db, pLevel->u
21490 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  .in.aInLoop,.   
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214b0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
214c0 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  f(pLevel->u.in.a
214d0 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65  InLoop[0])*pLeve
214e0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20  l->u.in.nIn);.  
214f0 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
21500 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  u.in.aInLoop;.  
21510 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
21520 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
21530 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a  ->u.in.nIn - 1;.
21540 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
21550 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
21560 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
21570 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
21580 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
21590 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
215a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
215b0 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
215c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
215d0 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
215e0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
215f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
21600 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
21610 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
21620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21630 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
21640 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ll, iReg);.    }
21650 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
21660 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
21670 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
21680 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
21690 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
216a0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
216b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
216c0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
216d0 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
216e0 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
216f0 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
21700 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  dex..**.** For e
21710 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72  xample, consider
21720 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c   table t1(a,b,c,
21730 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65  d,e,f) with inde
21740 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20  x i1(a,b,c)..** 
21750 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52  Suppose the WHER
21760 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73  E clause is this
21770 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e  :  a==5 AND b IN
21780 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35   (1,2,3) AND c>5
21790 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65   AND c<10.** The
217a0 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61   index has as ma
217b0 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61  ny as three equa
217c0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
217d0 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a  , but in this.**
217e0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68   example, the th
217f0 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73  ird "c" value is
21800 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
21810 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a   So only two .**
21820 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
21830 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f   coded.  This ro
21840 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72  utine will gener
21850 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
21860 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64  uate.** a==5 and
21870 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20   b IN (1,2,3).  
21880 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
21890 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77  es for a and b w
218a0 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a  ill be stored.**
218b0 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20   in consecutive 
218c0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
218d0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
218e0 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73  irst register is
218f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
21900 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
21910 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42  above nEq==2.  B
21920 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  ut this subrouti
21930 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
21940 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71   value.** of nEq
21950 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49   including 0.  I
21960 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72  f nEq==0, this r
21970 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79  outine is nearly
21980 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65   a no-op..** The
21990 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64   only thing it d
219a0 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20  oes is allocate 
219b0 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  the pLevel->iMem
219c0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
219d0 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20  .** compute the 
219e0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
219f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
21a00 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  ine always alloc
21a10 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
21a20 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
21a30 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
21a40 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d   index of that m
21a50 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20  emory cell. The 
21a60 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
21a70 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
21a80 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65  will use that me
21a90 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f  mory cell to sto
21aa0 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  re the terminati
21ab0 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  on.** key value 
21ac0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
21ad0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
21ae0 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
21af0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
21b00 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
21b10 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
21b20 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
21b30 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
21b40 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  use..**.** Befor
21b50 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
21b60 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Aff is set to po
21b70 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
21b80 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
21b90 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
21ba0 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
21bb0 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ng of the index 
21bc0 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a  allocated using.
21bd0 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ** sqlite3DbMall
21be0 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e  oc(). Except, en
21bf0 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70  tries in the cop
21c00 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
21c10 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
21c20 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  th equality cons
21c30 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65  traints that use
21c40 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61   NONE affinity a
21c50 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c  re set to.** SQL
21c60 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68  ITE_AFF_NONE. Th
21c70 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69  is is to deal wi
21c80 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74  th SQL such as t
21c90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
21ca0 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
21cb0 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49  LE t1(a TEXT PRI
21cc0 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a  MARY KEY, b);.**
21cd0 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
21ce0 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20  OM t1 AS t2, t1 
21cf0 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e  WHERE t1.a = t2.
21d00 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  b;.**.** In the 
21d10 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
21d20 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61  he index on t1(a
21d30 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e  ) has TEXT affin
21d40 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a  ity. But since.*
21d50 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  * the right hand
21d60 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75   side of the equ
21d70 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
21d80 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45   (t2.b) has NONE
21d90 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f   affinity,.** no
21da0 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75   conversion shou
21db0 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20  ld be attempted 
21dc0 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74  before using a t
21dd0 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72  2.b value as par
21de0 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f  t of.** a key to
21df0 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65   search the inde
21e00 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72  x. Hence the fir
21e10 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72  st byte in the r
21e20 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79  eturned affinity
21e30 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68  .** string in th
21e40 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64  is example would
21e50 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
21e60 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73  E_AFF_NONE..*/.s
21e70 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
21e80 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
21e90 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
21ea0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
21eb0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
21ec0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
21ed0 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e  el,   /* Which n
21ee0 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
21ef0 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f  e FROM we are co
21f00 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43  ding */.  WhereC
21f10 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
21f20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
21f30 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  use */.  Bitmask
21f40 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
21f50 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66  * Which parts of
21f60 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79   FROM have not y
21f70 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f  et been coded */
21f80 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67  .  int nExtraReg
21f90 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
21fa0 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
21fb0 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
21fc0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
21fd0 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Aff          /* 
21fe0 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e  OUT: Set to poin
21ff0 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74  t to affinity st
22000 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
22010 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70   nEq = pLevel->p
22020 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68  lan.nEq;   /* Th
22030 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
22040 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
22050 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64   to code */.  Vd
22060 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
22070 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
22080 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73  he vm under cons
22090 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  truction */.  In
220a0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
220b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
220c0 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75  he index being u
220d0 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f  sed for this loo
220e0 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  p */.  int iCur 
220f0 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
22100 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
22110 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
22120 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
22130 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
22140 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
22150 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
22160 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
22190 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  r */.  int regBa
221a0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
221b0 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
221c0 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ister */.  int n
221d0 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
221e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
221f0 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
22200 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
22210 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20   char *zAff;    
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22230 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
22240 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  g to return */..
22250 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
22260 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
22270 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
22280 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
22290 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
222a0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
222b0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
222c0 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d 20  XED );.  pIdx = 
222d0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
222e0 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  Idx;..  /* Figur
222f0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
22300 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
22310 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
22320 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
22330 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
22340 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
22350 20 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d    nReg = pLevel-
22360 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74  >plan.nEq + nExt
22370 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d  raReg;.  pParse-
22380 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a  >nMem += nReg;..
22390 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33    zAff = sqlite3
223a0 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
223b0 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65  >db, sqlite3Inde
223c0 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20  xAffinityStr(v, 
223d0 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a  pIdx));.  if( !z
223e0 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Aff ){.    pPars
223f0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
22400 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  led = 1;.  }..  
22410 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
22420 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
22430 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ints.  */.  asse
22440 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
22450 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28  n>=nEq );.  for(
22460 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
22470 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20  {.    int r1;.  
22480 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e    int k = pIdx->
22490 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
224a0 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
224b0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20  m(pWC, iCur, k, 
224c0 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
224d0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20  ->plan.wsFlags, 
224e0 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 70  pIdx);.    if( p
224f0 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
22500 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
22510 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69  owing true for i
22520 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
22530 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a  ndant columns. .
22540 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54      ** Ex: CREAT
22550 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
22560 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20  (a,b,a); SELECT 
22570 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
22580 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a  a=0 AND b=0; */.
22590 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
225a0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
225b0 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29  TERM_CODED)!=0 )
225c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
225d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
225e0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
225f0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
22600 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31 20  11662 */.    r1 
22610 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
22620 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
22630 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73  , pLevel, regBas
22640 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
22650 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
22660 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31       if( nReg==1
22670 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22680 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
22690 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  g(pParse, regBas
226a0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42  e);.        regB
226b0 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20  ase = r1;.      
226c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
226d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
226e0 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
226f0 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
22700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22710 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
22720 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
22730 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
22740 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
22750 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
22760 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
22770 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
22780 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
22790 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ))==0 ){.      E
227a0 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
227b0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
227c0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
227d0 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
227e0 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
227f0 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
22800 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
22810 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20    if( zAff ){.  
22820 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22830 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
22840 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
22850 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
22860 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
22870 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
22880 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
22890 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
228a0 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
228b0 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
228c0 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  e(pRight, zAff[j
228d0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
228e0 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
228f0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
22900 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22910 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20   }.  }.  *pzAff 
22920 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e  = zAff;.  return
22930 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66   regBase;.}..#if
22940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22950 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54  _EXPLAIN./*.** T
22960 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
22970 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c   helper for expl
22980 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20  ainIndexRange() 
22990 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72  below.**.** pStr
229a0 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20   holds the text 
229b0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
229c0 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69   that we are bui
229d0 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72  lding up one ter
229e0 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20  m.** at a time. 
229f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
22a00 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  ds a new term to
22a10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
22a20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54  expression..** T
22a30 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74  erms are separat
22a40 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64  ed by AND so add
22a50 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20   the "AND" text 
22a60 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73  for second and s
22a70 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72  ubsequent.** ter
22a80 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ms only..*/.stat
22a90 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41  ic void explainA
22aa0 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72  ppendTerm(.  Str
22ab0 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20  Accum *pStr,    
22ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22ad0 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20  text expression 
22ae0 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20  being built */. 
22af0 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20   int iTerm,     
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22b10 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65  Index of this te
22b20 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65  rm.  First is ze
22b30 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ro */.  const ch
22b40 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20  ar *zColumn,    
22b50 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
22b60 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
22b70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20  onst char *zOp  
22b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
22b90 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  me of the operat
22ba0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  or */.){.  if( i
22bb0 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74  Term ) sqlite3St
22bc0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
22bd0 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a  r, " AND ", 5);.
22be0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
22bf0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43  mAppend(pStr, zC
22c00 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71  olumn, -1);.  sq
22c10 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
22c20 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31  end(pStr, zOp, 1
22c30 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
22c40 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
22c50 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a   "?", 1);.}../*.
22c60 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76  ** Argument pLev
22c70 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73  el describes a s
22c80 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e  trategy for scan
22c90 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e  ning table pTab.
22ca0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
22cb0 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
22cc0 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
22cd0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
22ce0 6e 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ng a description
22cf0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65  .** of the subse
22d00 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20  t of table rows 
22d10 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73  scanned by the s
22d20 74 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66  trategy in the f
22d30 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c  orm of an.** SQL
22d40 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c   expression. Or,
22d50 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
22d60 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69   scanned, NULL i
22d70 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
22d80 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
22d90 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  f the query:.**.
22da0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
22db0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20  OM t1 WHERE a=1 
22dc0 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69  AND b>2;.**.** i
22dd0 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20  s run and there 
22de0 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  is an index on (
22df0 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73  a, b), then this
22e00 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
22e10 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69  s a.** string si
22e20 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
22e30 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a    "a=? AND b>?".
22e40 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
22e50 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
22e60 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  s to memory obta
22e70 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
22e80 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  3DbMalloc()..** 
22e90 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
22ea0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
22eb0 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74  caller to free t
22ec0 68 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69  he buffer when i
22ed0 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  t is.** no longe
22ee0 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  r required..*/.s
22ef0 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c  tatic char *expl
22f00 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71  ainIndexRange(sq
22f10 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
22f20 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54  Level *pLevel, T
22f30 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 57  able *pTab){.  W
22f40 68 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20  herePlan *pPlan 
22f50 3d 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b  = &pLevel->plan;
22f60 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
22f70 20 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78   = pPlan->u.pIdx
22f80 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 50  ;.  int nEq = pP
22f90 6c 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20  lan->nEq;.  int 
22fa0 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
22fb0 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
22fc0 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75  l;.  int *aiColu
22fd0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
22fe0 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75  olumn;.  StrAccu
22ff0 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45  m txt;..  if( nE
23000 71 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e  q==0 && (pPlan->
23010 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
23020 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
23030 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20  _TOP_LIMIT))==0 
23040 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
23050 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
23060 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c  rAccumInit(&txt,
23070 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41   0, 0, SQLITE_MA
23080 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74  X_LENGTH);.  txt
23090 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69  .db = db;.  sqli
230a0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
230b0 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29  d(&txt, " (", 2)
230c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
230d0 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78  Eq; i++){.    ex
230e0 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
230f0 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69  &txt, i, aCol[ai
23100 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65  Column[i]].zName
23110 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a  , "=");.  }..  j
23120 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 50 6c 61   = i;.  if( pPla
23130 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  n->wsFlags&WHERE
23140 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
23150 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
23160 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
23170 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
23180 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
23190 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
231a0 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
231b0 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  t, i++, z, ">");
231c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 6c 61 6e  .  }.  if( pPlan
231d0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
231e0 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
231f0 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
23200 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
23210 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
23220 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
23230 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
23240 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
23250 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20  , i, z, "<");.  
23260 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
23270 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
23280 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  ")", 1);.  retur
23290 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  n sqlite3StrAccu
232a0 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d  mFinish(&txt);.}
232b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
232c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
232d0 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c   unless currentl
232e0 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  y processing an 
232f0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
23300 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49  AN.** command. I
23310 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e  f the query bein
23320 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e  g compiled is an
23330 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
23340 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  LAN, a single.**
23350 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
23360 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74   to the output t
23370 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  o describe the t
23380 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65  able scan strate
23390 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c  gy in .** pLevel
233a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
233b0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
233c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
233d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
233e0 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
233f0 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
23400 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
23410 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
23420 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70  e list this loop
23430 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20   refers to */.  
23440 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
23450 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
23460 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65  /* Scan to write
23470 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
23480 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  de for */.  int 
23490 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
234a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
234b0 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22  alue for "level"
234c0 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
234d0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
234e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
234f0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
23500 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d  for "from" colum
23510 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
23520 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23540 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
23550 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
23560 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  Begin() */.){.  
23570 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
23580 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 75 33  ain==2 ){.    u3
23590 32 20 66 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  2 flags = pLevel
235a0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a  ->plan.wsFlags;.
235b0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
235c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
235d0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
235e0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
235f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
23600 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
23610 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73  /* VM being cons
23620 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73  tructed */.    s
23630 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
23640 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20  rse->db;     /* 
23650 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
23660 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  */.    char *zMs
23670 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
23680 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
23690 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75  add to EQP outpu
236a0 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
236b0 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20 20  _int64 nRow;    
236c0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
236d0 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
236e0 73 20 76 69 73 69 74 65 64 20 62 79 20 73 63 61  s visited by sca
236f0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  n */.    int iId
23700 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
23710 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74  ctId;  /* Select
23720 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f   id (left-most o
23730 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f  utput column) */
23740 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63  .    int isSearc
23750 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
23760 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
23770 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66   SEARCH. False f
23780 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20  or SCAN. */..   
23790 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
237a0 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28  E_MULTI_OR) || (
237b0 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
237c0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
237d0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ) return;..    i
237e0 73 53 65 61 72 63 68 20 3d 20 28 70 4c 65 76 65  sSearch = (pLeve
237f0 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20  l->plan.nEq>0). 
23800 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
23810 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
23820 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
23830 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
23840 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74           || (wct
23850 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f  rlFlags&(WHERE_O
23860 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45  RDERBY_MIN|WHERE
23870 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a  _ORDERBY_MAX));.
23880 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
23890 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
238a0 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53  %s", isSearch?"S
238b0 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a  EARCH":"SCAN");.
238c0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
238d0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
238e0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
238f0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
23900 20 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64   "%s SUBQUERY %d
23910 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69  ", zMsg,pItem->i
23920 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d  SelectId);.    }
23930 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67  else{.      zMsg
23940 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
23950 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
23960 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67   TABLE %s", zMsg
23970 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
23980 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
23990 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
239a0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
239b0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
239c0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25  , zMsg, "%s AS %
239d0 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
239e0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a  >zAlias);.    }.
239f0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
23a00 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
23a10 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
23a20 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61   *zWhere = expla
23a30 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c  inIndexRange(db,
23a40 20 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d 2d 3e   pLevel, pItem->
23a50 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73  pTab);.      zMs
23a60 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
23a70 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
23a80 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45  s USING %s%sINDE
23a90 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20  X%s%s%s", zMsg, 
23aa0 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61  .          ((fla
23ab0 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
23ac0 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49  INDEX)?"AUTOMATI
23ad0 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20  C ":""),.       
23ae0 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
23af0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f  RE_IDX_ONLY)?"CO
23b00 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20  VERING ":""),.  
23b10 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
23b20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
23b30 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20  EX)?"":" "),.   
23b40 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
23b50 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
23b60 58 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d 3e 70  X)?"": pLevel->p
23b70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d  lan.u.pIdx->zNam
23b80 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 57  e),.          zW
23b90 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  here.      );.  
23ba0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23bb0 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20  e(db, zWhere);. 
23bc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
23bd0 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
23be0 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
23bf0 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
23c00 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
23c10 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
23c20 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45  , "%s USING INTE
23c30 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
23c40 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20  , zMsg);..      
23c50 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
23c60 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20  ROWID_EQ ){.    
23c70 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
23c80 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
23c90 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d  Msg, "%s (rowid=
23ca0 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
23cb0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
23cc0 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  gs&WHERE_BOTH_LI
23cd0 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48  MIT)==WHERE_BOTH
23ce0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
23cf0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
23d00 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
23d10 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20  g, "%s (rowid>? 
23d20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a  AND rowid<?)", z
23d30 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
23d40 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52  e if( flags&WHER
23d50 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
23d60 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
23d70 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
23d80 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
23d90 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id>?)", zMsg);. 
23da0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
23db0 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
23dc0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
23dd0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
23de0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
23df0 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c   "%s (rowid<?)",
23e00 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
23e10 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
23e20 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
23e30 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20  LTABLE.    else 
23e40 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
23e50 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
23e60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
23e70 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
23e80 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
23e90 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
23ea0 49 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  Idx;.      zMsg 
23eb0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
23ec0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
23ed0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
23ee0 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67  DEX %d:%s", zMsg
23ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23f00 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64      pVtabIdx->id
23f10 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e  xNum, pVtabIdx->
23f20 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23  idxStr);.    }.#
23f30 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77 63  endif.    if( wc
23f40 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f  trlFlags&(WHERE_
23f50 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52  ORDERBY_MIN|WHER
23f60 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 20 29  E_ORDERBY_MAX) )
23f70 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
23f80 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
23f90 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
23fa0 20 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d   );.      nRow =
23fb0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
23fc0 20 20 20 20 20 6e 52 6f 77 20 3d 20 28 73 71 6c       nRow = (sql
23fd0 69 74 65 33 5f 69 6e 74 36 34 29 70 4c 65 76 65  ite3_int64)pLeve
23fe0 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20  l->plan.nRow;.  
23ff0 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73    }.    zMsg = s
24000 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
24010 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25  b, zMsg, "%s (~%
24020 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67  lld rows)", zMsg
24030 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c  , nRow);.    sql
24040 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
24050 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49  , OP_Explain, iI
24060 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d  d, iLevel, iFrom
24070 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
24080 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
24090 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
240a0 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78  nOneScan(u,v,w,x
240b0 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
240c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
240d0 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  AIN */.../*.** G
240e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
240f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
24100 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
24110 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
24120 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
24130 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
24140 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73   by pWInfo..*/.s
24150 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
24160 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
24170 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
24180 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
24190 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
241a0 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
241b0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
241c0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
241d0 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
241e0 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
241f0 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
24200 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
24210 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  s,      /* One o
24220 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
24230 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
24240 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
24250 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
24260 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61       /* Which ta
24270 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74  bles are current
24280 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ly available */.
24290 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20  ){.  int j, k;  
242a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
242b0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
242c0 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
242d0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
242e0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
242f0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
24300 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20  ddrNxt;         
24310 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
24320 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
24330 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
24340 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
24350 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  Table;       /* 
24360 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
24370 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
24380 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
24390 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
243a0 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
243b0 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
243c0 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  der */.  WhereLe
243d0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a  vel *pLevel;  /*
243e0 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c   The where level
243f0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
24400 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
24410 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70  WC;    /* Decomp
24420 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  osition of the e
24430 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75  ntire WHERE clau
24440 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
24450 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
24460 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45          /* A WHE
24470 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  RE clause term *
24480 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
24490 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
244a0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
244b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65  ontext */.  Vdbe
244c0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
244d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
244e0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  he prepared stmt
244f0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
24500 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ions */.  struct
24510 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24520 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f  TabItem;  /* FRO
24530 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
24540 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
24550 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20  nt addrBrk;     
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24570 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
24580 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
24590 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
245a0 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20  drCont;         
245b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
245c0 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
245d0 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63  ue with next cyc
245e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  le */.  int iRow
245f0 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  idReg = 0;      
24600 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74    /* Rowid is st
24610 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67  ored in this reg
24620 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65  ister, if not ze
24630 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c  ro */.  int iRel
24640 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20  easeReg = 0;    
24650 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
24660 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72  er to free befor
24670 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a  e returning */..
24680 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
24690 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d  o->pParse;.  v =
246a0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
246b0 20 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e    pWC = pWInfo->
246c0 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20  pWC;.  pLevel = 
246d0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65  &pWInfo->a[iLeve
246e0 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  l];.  pTabItem =
246f0 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
24700 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
24710 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70  rom];.  iCur = p
24720 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
24730 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76  ;.  bRev = (pLev
24740 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
24750 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
24760 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c  )!=0;.  omitTabl
24770 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  e = (pLevel->pla
24780 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
24790 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a  E_IDX_ONLY)!=0 .
247a0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77             && (w
247b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
247c0 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d  E_FORCE_TABLE)==
247d0 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  0;..  /* Create 
247e0 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
247f0 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
24800 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
24810 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ns.  ** for the 
24820 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
24830 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74  ump to addrBrk t
24840 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61  o break out of a
24850 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70   loop..  ** Jump
24860 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
24870 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
24880 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
24890 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f   of the.  ** loo
248a0 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  p..  **.  ** Whe
248b0 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  n there is an IN
248c0 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c   operator, we al
248d0 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e  so have a "addrN
248e0 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20  xt" label that. 
248f0 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e   ** means to con
24900 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
24910 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d  ext IN value com
24920 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a  bination.  When.
24930 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e    ** there are n
24940 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69  o IN operators i
24950 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
24960 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22  s, the "addrNxt"
24970 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74   label.  ** is t
24980 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72  he same as "addr
24990 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  Brk"..  */.  add
249a0 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
249b0 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
249c0 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
249d0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
249e0 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d  v);.  addrCont =
249f0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
24a00 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
24a10 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
24a20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
24a30 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
24a40 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
24a50 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  IN, allocate and
24a60 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
24a70 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74   a memory cell t
24a80 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74  hat records if t
24a90 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65  his table matche
24aa0 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  s any.  ** row o
24ab0 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
24ac0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
24ad0 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
24ae0 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61  >iFrom>0 && (pTa
24af0 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70  bItem[0].jointyp
24b00 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
24b10 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ){.    pLevel->i
24b20 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61  LeftJoin = ++pPa
24b30 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
24b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24b50 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
24b60 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  0, pLevel->iLeft
24b70 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
24b80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74  omment((v, "init
24b90 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61   LEFT JOIN no-ma
24ba0 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d  tch flag"));.  }
24bb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
24bc0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
24bd0 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65 76 65  LE.  if(  (pLeve
24be0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
24bf0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
24c00 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
24c10 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65 20  /* Case 0:  The 
24c20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
24c30 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
24c40 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
24c50 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  Next.    **     
24c60 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
24c70 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  he data..    */.
24c80 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20      int iReg;   
24c90 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20  /* P3 Value for 
24ca0 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20  OP_VFilter */.  
24cb0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
24cc0 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d  info *pVtabIdx =
24cd0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
24ce0 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20 69 6e  pVtabIdx;.    in
24cf0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
24d00 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e 73 74  pVtabIdx->nConst
24d10 72 61 69 6e 74 3b 0a 20 20 20 20 73 74 72 75 63  raint;.    struc
24d20 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
24d30 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
24d40 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20   *aUsage =.     
24d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d70 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
24d80 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
24d90 55 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Usage;.    const
24da0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
24db0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
24dc0 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a   *aConstraint =.
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e00 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74  pVtabIdx->aConst
24e10 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73 71 6c 69  raint;..    sqli
24e20 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
24e30 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
24e40 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
24e50 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
24e60 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
24e70 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c  .    for(j=1; j<
24e80 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  =nConstraint; j+
24e90 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  +){.      for(k=
24ea0 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; k<nConstraint
24eb0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
24ec0 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72  if( aUsage[k].ar
24ed0 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20  gvIndex==j ){.  
24ee0 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72          int iTer
24ef0 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  m = aConstraint[
24f00 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  k].iTermOffset;.
24f10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24f20 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24f30 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  , pWC->a[iTerm].
24f40 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
24f50 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20  Reg+j+1);.      
24f60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
24f70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24f80 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74     if( k==nConst
24f90 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20  raint ) break;. 
24fa0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24fb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24fc0 5f 49 6e 74 65 67 65 72 2c 20 70 56 74 61 62 49  _Integer, pVtabI
24fd0 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67  dx->idxNum, iReg
24fe0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
24ff0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
25000 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65  nteger, j-1, iRe
25010 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g+1);.    sqlite
25020 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
25030 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c  P_VFilter, iCur,
25040 20 61 64 64 72 42 72 6b 2c 20 69 52 65 67 2c 20   addrBrk, iReg, 
25050 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72  pVtabIdx->idxStr
25060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25070 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
25080 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
25090 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  tr ? P4_MPRINTF 
250a0 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
250b0 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64    pVtabIdx->need
250c0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
250d0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
250e0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
250f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 55  +){.      if( aU
25100 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a  sage[j].omit ){.
25110 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72          int iTer
25120 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  m = aConstraint[
25130 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  j].iTermOffset;.
25140 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
25150 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57 43  erm(pLevel, &pWC
25160 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20  ->a[iTerm]);.   
25170 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
25180 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56  Level->op = OP_V
25190 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
251a0 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
251b0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
251c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
251d0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
251e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
251f0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65  ange(pParse, iRe
25200 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  g, nConstraint+2
25210 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
25220 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
25230 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  e, 1);.  }else.#
25240 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
25250 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
25260 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76  E */..  if( pLev
25270 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
25280 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   & WHERE_ROWID_E
25290 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  Q ){.    /* Case
252a0 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   1:  We can dire
252b0 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
252c0 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
252d0 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  g an.    **     
252e0 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
252f0 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
25300 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
25310 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20  .  Or.    **    
25320 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
25330 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
25340 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
25350 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  IN (...)".    **
25360 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
25370 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
25380 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
25390 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
253a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65  pParse);.    pTe
253b0 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
253c0 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
253d0 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
253e0 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  IN, 0);.    asse
253f0 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
25400 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
25410 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
25420 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
25430 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
25440 75 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ur );.    assert
25450 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
25460 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
25470 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
25480 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
25490 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
254a0 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f  11662 */.    iRo
254b0 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75  widReg = codeEqu
254c0 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
254d0 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
254e0 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
254f0 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
25500 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
25510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25520 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
25530 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  Int, iRowidReg, 
25540 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71  addrNxt);.    sq
25550 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
25560 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
25570 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20   iCur, addrNxt, 
25580 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
25590 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
255a0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
255b0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
255c0 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  g);.    VdbeComm
255d0 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
255e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
255f0 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73   OP_Noop;.  }els
25600 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  e if( pLevel->pl
25610 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
25620 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29  RE_ROWID_RANGE )
25630 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a  {.    /* Case 2:
25640 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
25650 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
25660 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
25670 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
25680 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f  */.    int testO
25690 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
256a0 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
256b0 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20  int memEndValue 
256c0 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
256d0 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
256e0 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  d;..    assert( 
256f0 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
25700 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e      pStart = fin
25710 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
25720 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
25730 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a  O_GT|WO_GE, 0);.
25740 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54      pEnd = findT
25750 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
25760 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
25770 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20  LT|WO_LE, 0);.  
25780 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
25790 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61      pTerm = pSta
257a0 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74  rt;.      pStart
257b0 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70   = pEnd;.      p
257c0 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  End = pTerm;.   
257d0 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72   }.    if( pStar
257e0 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
257f0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
25800 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
25810 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  on that defines 
25820 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20  the start bound 
25830 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  */.      int r1,
25840 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f   rTemp;        /
25850 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20  * Registers for 
25860 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72  holding the star
25870 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20  t boundary */.. 
25880 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
25890 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d  owing constant m
258a0 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20  aps TK_xx codes 
258b0 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69  into correspondi
258c0 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65  ng .      ** see
258d0 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64  k opcodes.  It d
258e0 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74  epends on a part
258f0 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20  icular ordering 
25900 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a  of TK_xx.      *
25910 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  /.      const u8
25920 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20   aMoveOp[] = {. 
25930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
25940 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74  GT */  OP_SeekGt
25950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
25960 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LE */  OP_See
25970 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLe,.           
25980 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f  /* TK_LT */  OP_
25990 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20  SeekLt,.        
259a0 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20     /* TK_GE */  
259b0 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20  OP_SeekGe.      
259c0 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  };.      assert(
259d0 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20   TK_LE==TK_GT+1 
259e0 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );      /* Make 
259f0 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e  sure the orderin
25a00 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  g.. */.      ass
25a10 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
25a20 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+2 );      /*  
25a30 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78  ... of the TK_xx
25a40 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20   values... */.  
25a50 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
25a60 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20  E==TK_GT+3 );   
25a70 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f     /*  ... is co
25a80 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20  rrecct. */..    
25a90 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
25aa0 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
25ab0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
25ac0 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
25ad0 36 32 20 2a 2f 0a 20 20 20 20 20 20 70 58 20 3d  62 */.      pX =
25ae0 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
25af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
25b00 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
25b10 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66  ert( pStart->lef
25b20 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
25b30 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
25b40 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
25b50 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
25b60 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20  ht, &rTemp);.   
25b70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25b80 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b  dOp3(v, aMoveOp[
25b90 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69  pX->op-TK_GT], i
25ba0 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31  Cur, addrBrk, r1
25bb0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
25bc0 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
25bd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25be0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
25bf0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
25c00 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
25c10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
25c20 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29  g(pParse, rTemp)
25c30 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  ;.      disableT
25c40 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61  erm(pLevel, pSta
25c50 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rt);.    }else{.
25c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25c70 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
25c80 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
25c90 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  ewind, iCur, add
25ca0 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rBrk);.    }.   
25cb0 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20   if( pEnd ){.   
25cc0 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20     Expr *pX;.   
25cd0 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45     pX = pEnd->pE
25ce0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
25cf0 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
25d00 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e    assert( pEnd->
25d10 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
25d20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
25d30 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67  se( pEnd->wtFlag
25d40 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
25d50 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
25d60 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
25d70 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20    memEndValue = 
25d80 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
25d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25da0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58  rCode(pParse, pX
25db0 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64  ->pRight, memEnd
25dc0 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
25dd0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  ( pX->op==TK_LT 
25de0 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  || pX->op==TK_GT
25df0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
25e00 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
25e10 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20  e : OP_Ge;.     
25e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25e30 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
25e40 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20  OP_Lt : OP_Gt;. 
25e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73       }.      dis
25e60 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
25e70 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20   pEnd);.    }.  
25e80 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
25e90 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
25ea0 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  (v);.    pLevel-
25eb0 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  >op = bRev ? OP_
25ec0 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
25ed0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
25ee0 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
25ef0 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
25f00 20 20 20 69 66 28 20 70 53 74 61 72 74 3d 3d 30     if( pStart==0
25f10 20 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b 0a 20   && pEnd==0 ){. 
25f20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
25f30 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
25f40 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
25f50 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
25f60 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
25f70 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
25f80 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f   }.    if( testO
25f90 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
25fa0 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
25fb0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
25fc0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
25fd0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
25fe0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25ff0 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
26000 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
26010 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26020 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
26030 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
26040 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
26050 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26060 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d  3(v, testOp, mem
26070 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72  EndValue, addrBr
26080 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  k, iRowidReg);. 
26090 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
260a0 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
260b0 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
260c0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
260d0 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  LL);.    }.  }el
260e0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
260f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57  lan.wsFlags & (W
26100 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
26110 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  E|WHERE_COLUMN_E
26120 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  Q) ){.    /* Cas
26130 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e  e 3: A scan usin
26140 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  g an index..    
26150 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
26160 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
26170 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a  se may contain z
26180 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61  ero or more equa
26190 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  lity .    **    
261a0 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22       terms ("=="
261b0 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f   or "IN" operato
261c0 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74  rs) that refer t
261d0 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20  o the N.    **  
261e0 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74         left-most
261f0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
26200 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c  index. It may al
26210 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  so contain.    *
26220 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61  *         inequa
26230 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
26240 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d   (>, <, >= or <=
26250 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64  ) on the indexed
26260 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
26270 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65  column that imme
26280 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20  diately follows 
26290 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73  the N equalities
262a0 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20  . Only .    **  
262b0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
262c0 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
262d0 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
262e0 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
262f0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
26300 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
26310 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
26320 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
26330 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20  f the .    **   
26340 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f        index is o
26350 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20  n (x,y,z), then 
26360 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c  the following cl
26370 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20  auses are all . 
26380 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70     **         op
26390 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a  timized:.    **.
263a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
263b0 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20    x=5.    **    
263c0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
263d0 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y=10.    **     
263e0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
263f0 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
26400 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e        x=5 AND y>
26410 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
26420 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
26430 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d   AND y=5 AND z<=
26440 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
26450 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31           The z<1
26460 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  0 term of the fo
26470 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62  llowing cannot b
26480 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20  e used, only.   
26490 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
264a0 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a  x=5 term:.    **
264b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
264c0 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a     x=5 AND z<10.
264d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
264e0 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a        N may be z
264f0 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
26500 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
26510 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  traints..    ** 
26520 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
26530 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69   are no inequali
26540 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
26550 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20  then N is at.   
26560 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73   **         leas
26570 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  t one..    **.  
26580 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69    **         Thi
26590 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75  s case is also u
265a0 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  sed when there a
265b0 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
265c0 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  se.    **       
265d0 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75    constraints bu
265e0 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65  t an index is se
265f0 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69  lected anyway, i
26600 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20  n order.    **  
26610 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20         to force 
26620 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72  the output order
26630 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61   to conform to a
26640 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20  n ORDER BY..    
26650 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20  */  .    static 
26660 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f  const u8 aStartO
26670 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c  p[] = {.      0,
26680 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
26690 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
266a0 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61       /* 2: (!sta
266b0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
266c0 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62  & startEq &&  !b
266d0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
266e0 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20  _Last,          
266f0 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74     /* 3: (!start
26700 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
26710 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65  startEq &&   bRe
26720 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
26730 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20  eekGt,          
26740 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f   /* 4: (start_co
26750 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
26760 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
26770 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
26780 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kLt,           /
26790 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 5: (start_cons
267a0 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
267b0 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
267c0 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
267d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
267e0 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  6: (start_constr
267f0 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
26800 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
26810 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20        OP_SeekLe 
26820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a             /* 7:
26830 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
26840 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
26850 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
26860 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20    };.    static 
26870 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b  const u8 aEndOp[
26880 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e  ] = {.      OP_N
26890 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
268a0 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e   /* 0: (!end_con
268b0 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20  straints) */.   
268c0 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20     OP_IdxGE,    
268d0 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
268e0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
268f0 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
26900 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20    OP_IdxLT      
26910 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e         /* 2: (en
26920 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
26930 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b   bRev) */.    };
26940 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  .    int nEq = p
26950 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b  Level->plan.nEq;
26960 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
26970 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f  = or IN terms */
26980 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75  .    int isMinQu
26990 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ery = 0;        
269a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
269b0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c  an optimized SEL
269c0 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a  ECT min(x).. */.
269d0 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269f0 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
26a00 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72  r holding constr
26a10 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  aint values */. 
26a20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20     int r1;      
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
26a50 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
26a60 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d  m *pRangeStart =
26a70 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69   0;  /* Inequali
26a80 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
26a90 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a   range start */.
26aa0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
26ab0 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20  RangeEnd = 0;   
26ac0 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
26ad0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
26ae0 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  ge end */.    in
26af0 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20  t startEq;      
26b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
26b10 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72  ue if range star
26b20 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72  t uses ==, >= or
26b30 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65   <= */.    int e
26b40 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  ndEq;           
26b50 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26b60 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65  if range end use
26b70 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
26b80 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f  /.    int start_
26b90 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20  constraints;    
26ba0 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72     /* Start of r
26bb0 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69  ange is constrai
26bc0 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ned */.    int n
26bd0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20  Constraint;     
26be0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
26bf0 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20  r of constraint 
26c00 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64  terms */.    Ind
26c10 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
26c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26c30 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62   index we will b
26c40 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  e using */.    i
26c50 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
26c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26c70 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
26c80 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
26c90 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65      int nExtraRe
26ca0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
26cb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
26cc0 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65  tra registers ne
26cd0 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  eded */.    int 
26ce0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
26cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74           /* Inst
26d00 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ruction opcode *
26d10 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61  /.    char *zSta
26d20 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  rtAff;          
26d30 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
26d40 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67  or start of rang
26d50 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
26d60 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66      char *zEndAf
26d70 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
26d80 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
26d90 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f   end of range co
26da0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20  nstraint */..   
26db0 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
26dc0 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20  plan.u.pIdx;.   
26dd0 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
26de0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
26df0 6b 20 3d 20 28 6e 45 71 3d 3d 70 49 64 78 2d 3e  k = (nEq==pIdx->
26e00 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20 70  nColumn ? -1 : p
26e10 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  Idx->aiColumn[nE
26e20 71 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  q]);..    /* If 
26e30 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66  this loop satisf
26e40 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72  ies a sort order
26e50 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75   (pOrderBy) requ
26e60 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a  est that .    **
26e70 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
26e80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
26e90 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c  implement a "SEL
26ea0 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20  ECT min(x) ..." 
26eb0 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74  .    ** query, t
26ec0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hen the caller w
26ed0 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74  ill only allow t
26ee0 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66  he loop to run f
26ef0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  or.    ** a sing
26f00 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68  le iteration. Th
26f10 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
26f20 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75  e first row retu
26f30 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75  rned.    ** shou
26f40 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55  ld not have a NU
26f50 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  LL value stored 
26f60 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d  in 'x'. If colum
26f70 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20  n 'x' is.    ** 
26f80 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66  the first one af
26f90 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61  ter the nEq equa
26fa0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
26fb0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20   in the index,. 
26fc0 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69     ** this requi
26fd0 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c  res some special
26fe0 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a   handling..    *
26ff0 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74 72 6c  /.    if( (wctrl
27000 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
27010 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20  RBY_MIN)!=0.    
27020 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61   && (pLevel->pla
27030 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  n.wsFlags&WHERE_
27040 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20 26 26  ORDERBY).     &&
27050 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e   (pIdx->nColumn>
27060 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
27070 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72    /* assert( pOr
27080 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20  derBy->nExpr==1 
27090 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61  ); */.      /* a
270a0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
270b0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[0].pExpr->iCo
270c0 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
270d0 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a  lumn[nEq] ); */.
270e0 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79        isMinQuery
270f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74   = 1;.      nExt
27100 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
27110 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e  ..    /* Find an
27120 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  y inequality con
27130 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f  straint terms fo
27140 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  r the start and 
27150 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  end .    ** of t
27160 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a  he range. .    *
27170 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
27180 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
27190 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
271a0 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
271b0 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  End = findTerm(p
271c0 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  WC, iCur, k, not
271d0 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f  Ready, (WO_LT|WO
271e0 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20  _LE), pIdx);.   
271f0 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
27200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27210 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
27220 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
27230 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
27240 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66 69  pRangeStart = fi
27250 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
27260 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28  , k, notReady, (
27270 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49  WO_GT|WO_GE), pI
27280 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  dx);.      nExtr
27290 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
272a0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
272b0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
272c0 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
272d0 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20   terms using == 
272e0 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64  or IN.    ** and
272f0 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
27300 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  s of those terms
27310 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
27320 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
27330 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67   starting at reg
27340 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Base..    */.   
27350 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41   regBase = codeA
27360 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
27370 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
27380 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f   pLevel, pWC, no
27390 74 52 65 61 64 79 2c 20 6e 45 78 74 72 61 52 65  tReady, nExtraRe
273a0 67 2c 20 26 7a 53 74 61 72 74 41 66 66 0a 20 20  g, &zStartAff.  
273b0 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66    );.    zEndAff
273c0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
273d0 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  up(pParse->db, z
273e0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61  StartAff);.    a
273f0 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
27400 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f  >addrNxt;..    /
27410 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
27420 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65  g a reverse orde
27430 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63  r scan on an asc
27440 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72  ending index, or
27450 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72  .    ** a forwar
27460 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  d order scan on 
27470 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
27480 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20  ex, interchange 
27490 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  the .    ** star
274a0 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20  t and end terms 
274b0 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64  (pRangeStart and
274c0 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20   pRangeEnd)..   
274d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71   */.    if( (nEq
274e0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26  <pIdx->nColumn &
274f0 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61  & bRev==(pIdx->a
27500 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
27510 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a  SQLITE_SO_ASC)).
27520 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26       || (bRev &&
27530 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
27540 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
27550 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
27560 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70   *, pRangeEnd, p
27570 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
27580 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65   }..    testcase
27590 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
275a0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
275b0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
275c0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
275d0 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
275e0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
275f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
27600 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
27610 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61  pRangeEnd && pRa
27620 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
27630 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
27640 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
27650 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e  eEnd && pRangeEn
27660 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
27670 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61 72  O_GE );.    star
27680 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61  tEq = !pRangeSta
27690 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72  rt || pRangeStar
276a0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  t->eOperator & (
276b0 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
276c0 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61    endEq =   !pRa
276d0 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65  ngeEnd || pRange
276e0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
276f0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
27700 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
27710 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74  aints = pRangeSt
27720 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20  art || nEq>0;.. 
27730 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69     /* Seek the i
27740 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74  ndex cursor to t
27750 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
27760 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43  range. */.    nC
27770 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
27780 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53  .    if( pRangeS
27790 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78  tart ){.      Ex
277a0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
277b0 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d  ngeStart->pExpr-
277c0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73  >pRight;.      s
277d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
277e0 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
277f0 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
27800 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53 74     if( (pRangeSt
27810 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
27820 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
27830 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27840 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
27850 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
27860 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
27870 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
27880 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66     if( zStartAff
27890 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
278a0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
278b0 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
278c0 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d  StartAff[nEq])==
278d0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
278e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
278f0 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  ince the compari
27900 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72  son is to be per
27910 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63  formed with no c
27920 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20  onversions.     
27930 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20       ** applied 
27940 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c  to the operands,
27950 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74   set the affinit
27960 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52  y to apply to pR
27970 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20  ight to .       
27980 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46     ** SQLITE_AFF
27990 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20  _NONE.  */.     
279a0 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
279b0 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
279c0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
279d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
279e0 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
279f0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
27a00 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
27a10 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  nEq]) ){.       
27a20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71     zStartAff[nEq
27a30 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
27a40 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
27a50 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e       }  .      n
27a60 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
27a70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
27a80 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
27a90 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
27aa0 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
27ab0 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
27ac0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e   }else if( isMin
27ad0 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73  Query ){.      s
27ae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
27af0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
27b00 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
27b10 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
27b20 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71  +;.      startEq
27b30 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72   = 0;.      star
27b40 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
27b50 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  1;.    }.    cod
27b60 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
27b70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
27b80 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74  nConstraint, zSt
27b90 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20  artAff);.    op 
27ba0 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72  = aStartOp[(star
27bb0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32  t_constraints<<2
27bc0 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29  ) + (startEq<<1)
27bd0 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73   + bRev];.    as
27be0 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20  sert( op!=0 );. 
27bf0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
27c00 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20  =OP_Rewind );.  
27c10 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
27c20 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74  OP_Last );.    t
27c30 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
27c40 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65  SeekGt );.    te
27c50 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
27c60 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73  eekGe );.    tes
27c70 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
27c80 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74  ekLe );.    test
27c90 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
27ca0 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  kLt );.    sqlit
27cb0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
27cc0 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
27cd0 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
27ce0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
27cf0 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
27d00 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69   value for the i
27d10 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
27d20 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  aint at the end 
27d30 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61  of the.    ** ra
27d40 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  nge (if any)..  
27d50 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72    */.    nConstr
27d60 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
27d70 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b  if( pRangeEnd ){
27d80 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
27d90 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d  ght = pRangeEnd-
27da0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
27db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27dc0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
27dd0 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  rse, regBase+nEq
27de0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
27df0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
27e00 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
27e10 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
27e20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e  if( (pRangeEnd->
27e30 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
27e40 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
27e50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27e60 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
27e70 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
27e80 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
27e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27ea0 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20  ( zEndAff ){.   
27eb0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
27ec0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
27ed0 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b  pRight, zEndAff[
27ee0 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
27ef0 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
27f00 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
27f10 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
27f20 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
27f30 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
27f40 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
27f50 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
27f60 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
27f70 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
27f80 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
27f90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
27fa0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
27fb0 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64  /.          zEnd
27fc0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
27fd0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
27fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
27ff0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
28000 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
28010 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ge(pRight, zEndA
28020 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
28030 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
28040 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
28050 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
28060 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
28070 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
28080 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
28090 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66  e, nEq+1, zEndAf
280a0 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  f);.      nConst
280b0 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
280c0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
280d0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
280e0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
280f0 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
28100 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  62 */.    }.    
28110 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
28120 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74  arse->db, zStart
28130 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
28140 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
28150 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20  db, zEndAff);.. 
28160 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
28170 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20   loop body */.  
28180 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
28190 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
281a0 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f  tAddr(v);..    /
281b0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69  * Check if the i
281c0 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70  ndex cursor is p
281d0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
281e0 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
281f0 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52   op = aEndOp[(pR
28200 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20  angeEnd || nEq) 
28210 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20  * (1 + bRev)];. 
28220 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
28230 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20  =OP_Noop );.    
28240 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
28250 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65  _IdxGE );.    te
28260 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
28270 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20  dxLT );.    if( 
28280 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
28290 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
282a0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
282b0 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
282c0 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
282d0 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20  straint);.      
282e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
282f0 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52  eP5(v, endEq!=bR
28300 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a  ev ?1:0);.    }.
28310 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
28320 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
28330 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65  constraints, che
28340 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
28350 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
28360 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61  table column tha
28370 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  t the inequality
28380 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f   contrains is no
28390 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49  t NULL..    ** I
283a0 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f  f it is, jump to
283b0 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
283c0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ion of the loop.
283d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d  .    */.    r1 =
283e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
283f0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
28400 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c  testcase( pLevel
28410 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
28420 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
28430 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
28440 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
28450 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
28460 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  OP_LIMIT );.    
28470 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
28480 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
28490 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
284a0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d  RE_TOP_LIMIT))!=
284b0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
284c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
284d0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
284e0 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20  ur, nEq, r1);.  
284f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
28510 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74  ll, r1, addrCont
28520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
28530 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
28540 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
28550 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
28560 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
28570 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
28580 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
28590 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72  evel, pRangeStar
285a0 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54  t);.    disableT
285b0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
285c0 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20  geEnd);.    if( 
285d0 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
285e0 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
285f0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
28600 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
28610 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
28620 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28630 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
28640 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
28650 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
28660 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
28670 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
28680 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
28690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
286a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
286b0 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  ek, iCur, iRowid
286c0 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72  Reg);  /* Deferr
286d0 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d  ed seek */.    }
286e0 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  ..    /* Record 
286f0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
28700 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  used to terminat
28710 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61  e the loop. Disa
28720 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52  ble .    ** WHER
28730 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  E clause terms m
28740 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79  ade redundant by
28750 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65   the index range
28760 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   scan..    */.  
28770 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
28780 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
28790 52 45 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20  RE_UNIQUE ){.   
287a0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
287b0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
287c0 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20  se if( bRev ){. 
287d0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
287e0 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d  = OP_Prev;.    }
287f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
28800 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
28810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
28820 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
28830 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
28840 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
28850 20 57 48 45 52 45 5f 43 4f 56 45 52 5f 53 43 41   WHERE_COVER_SCA
28860 4e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  N ){.      pLeve
28870 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
28880 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
28890 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
288a0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
288b0 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
288c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
288d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
288e0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
288f0 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 65 76  ATION.  if( pLev
28900 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
28910 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
28920 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  R ){.    /* Case
28930 20 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65   4:  Two or more
28940 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65   separately inde
28950 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
28960 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a  ted by OR.    **
28970 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
28980 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
28990 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
289a0 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a  (a,b,c,d);.    *
289b0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
289c0 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20   i1 ON t1(a);.  
289d0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
289e0 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b  DEX i2 ON t1(b);
289f0 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
28a00 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28   INDEX i3 ON t1(
28a10 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  c);.    **.    *
28a20 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
28a30 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f  M t1 WHERE a=5 O
28a40 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41  R b=7 OR (c=11 A
28a50 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a  ND d=13).    **.
28a60 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78      ** In the ex
28a70 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65  ample, there are
28a80 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74   three indexed t
28a90 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
28aa0 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65  y OR..    ** The
28ab0 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
28ac0 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
28ad0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
28ae0 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
28af0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
28b00 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
28b10 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
28b20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
28b30 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64  en, for each ind
28b40 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66  exed term, the f
28b50 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72  ollowing. The ar
28b60 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a  guments to.    *
28b70 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65  * RowSetTest are
28b80 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72   such that the r
28b90 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72  owid of the curr
28ba0 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72  ent row is inser
28bb0 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ted.    ** into 
28bc0 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69  the RowSet. If i
28bd0 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65  t is already pre
28be0 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b  sent, control sk
28bf0 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  ips the.    ** G
28c00 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20  osub opcode and 
28c10 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74  jumps straight t
28c20 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
28c30 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64  ated by WhereEnd
28c40 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
28c50 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
28c60 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d  WhereBegin(<term
28c70 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  >).    **       
28c80 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20     RowSetTest   
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
28ca0 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e   Insert rowid in
28cb0 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a  to rowset.    **
28cc0 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
28cd0 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20       2 A.    ** 
28ce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
28cf0 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a  ereEnd().    **.
28d00 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67      ** Following
28d10 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65   the above, code
28d20 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
28d30 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c  e loop. Label A,
28d40 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20   the target.    
28d50 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20  ** of the Gosub 
28d60 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20  above, jumps to 
28d70 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
28d80 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
28d90 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Goto..    **.   
28da0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
28db0 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
28dc0 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
28dd0 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
28de0 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  g 1.    **      
28df0 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42      Goto       B
28e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e10 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69  # The loop is fi
28e20 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nished..    **. 
28e30 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c     **       A: <
28e40 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20  loop body>      
28e50 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74             # Ret
28e60 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76  urn data, whatev
28e70 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  er..    **.    *
28e80 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  *          Retur
28e90 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20  n     2         
28ea0 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61         # Jump ba
28eb0 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a  ck to the Gosub.
28ec0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
28ed0 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68      B: <after th
28ee0 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20  e loop>.    **. 
28ef0 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43     */.    WhereC
28f00 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
28f10 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73   /* The OR-claus
28f20 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
28f30 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
28f40 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61    SrcList *pOrTa
28f50 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  b;       /* Shor
28f60 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74  tened table list
28f70 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65   or OR-clause ge
28f80 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
28f90 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b  Index *pCov = 0;
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28fb0 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69  Potential coveri
28fc0 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c  ng index (or NUL
28fd0 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  L) */.    int iC
28fe0 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  ovCur = pParse->
28ff0 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73  nTab++;  /* Curs
29000 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  or used for inde
29010 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29  x scans (if any)
29020 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67   */..    int reg
29030 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
29040 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  e->nMem;        
29050 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75     /* Register u
29060 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75  sed with OP_Gosu
29070 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  b */.    int reg
29080 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20  Rowset = 0;     
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290a0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
290b0 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  or RowSet object
290c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
290d0 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290f0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
29100 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20  lding rowid */. 
29110 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79     int iLoopBody
29120 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
29130 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
29140 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f  Start of loop bo
29150 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52  dy */.    int iR
29160 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  etInit;         
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29180 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
29190 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74  f regReturn init
291a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65   */.    int unte
291b0 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20  stedTerms = 0;  
291c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
291d0 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d  me terms not com
291e0 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a  pletely tested *
291f0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
29220 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
29230 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d  Expr *pAndExpr =
29240 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
29250 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44     /* An ".. AND
29260 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69   (...)" expressi
29270 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 54  on */.   .    pT
29280 65 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  erm = pLevel->pl
29290 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20 20  an.u.pTerm;.    
292a0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
292b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
292c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
292d0 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61  ==WO_OR );.    a
292e0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
292f0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
29300 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20  INFO)!=0 );.    
29310 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWc = &pTerm->
29320 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
29330 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
29340 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  OP_Return;.    p
29350 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52  Level->p1 = regR
29360 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53  eturn;..    /* S
29370 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c  et up a new SrcL
29380 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f  ist in pOrTab co
29390 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
293a0 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  le being scanned
293b0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
293c0 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d  loop in the a[0]
293d0 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f   slot and all no
293e0 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e  tReady tables in
293f0 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20   a[1..] slots.. 
29400 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d     ** This becom
29410 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  es the SrcList i
29420 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
29430 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
29440 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20  hereBegin()..   
29450 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e   */.    if( pWIn
29460 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a  fo->nLevel>1 ){.
29470 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65        int nNotRe
29480 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
29490 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
294a0 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74  er of notReady t
294b0 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73  ables */.      s
294c0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
294d0 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20  em *origSrc;    
294e0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73   /* Original lis
294f0 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
29500 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d       nNotReady =
29510 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
29520 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20  - iLevel - 1;.  
29530 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c      pOrTab = sql
29540 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
29550 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  w(pParse->db,.  
29560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29570 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
29580 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
29590 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
295a0 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
295b0 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
295c0 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
295d0 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
295e0 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36 29 28  >nAlloc = (i16)(
295f0 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a  nNotReady + 1);.
29600 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53        pOrTab->nS
29610 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c  rc = pOrTab->nAl
29620 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  loc;.      memcp
29630 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61  y(pOrTab->a, pTa
29640 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70  bItem, sizeof(*p
29650 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20  TabItem));.     
29660 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66   origSrc = pWInf
29670 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
29680 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
29690 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b  <=nNotReady; k++
296a0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
296b0 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c  y(&pOrTab->a[k],
296c0 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c   &origSrc[pLevel
296d0 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65  [k].iFrom], size
296e0 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29  of(pOrTab->a[k])
296f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29700 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54  else{.      pOrT
29710 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ab = pWInfo->pTa
29720 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  bList;.    }..  
29730 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
29740 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73  the rowset regis
29750 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e  ter to contain N
29760 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c  ULL. An SQL NULL
29770 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69   is .    ** equi
29780 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70  valent to an emp
29790 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a  ty rowset..    *
297a0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e  *.    ** Also in
297b0 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75  itialize regRetu
297c0 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  rn to contain th
297d0 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
297e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20   instruction .  
297f0 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
29800 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f   following the O
29810 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20  P_Return at the 
29820 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
29830 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  op. This.    ** 
29840 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61  is required in a
29850 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46   few obscure LEF
29860 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65  T JOIN cases whe
29870 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  re control jumps
29880 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65  .    ** over the
29890 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
298a0 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
298b0 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61  f it. In this ca
298c0 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  se the .    ** c
298d0 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20  orrect response 
298e0 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c  for the end-of-l
298f0 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50  oop code (the OP
29900 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a  _Return) is to .
29910 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f      ** fall thro
29920 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
29930 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73  instruction, jus
29940 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20  t as an OP_Next 
29950 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63  does if.    ** c
29960 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  alled on an unin
29970 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72  itialized cursor
29980 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29990 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
299a0 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
299b0 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
299c0 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
299d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
299e0 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
299f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
29a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29a10 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
29a20 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
29a30 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
29a40 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
29a50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
29a60 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
29a70 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  rn);..    /* If 
29a80 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  the original WHE
29a90 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f  RE clause is z o
29aa0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31  f the form:  (x1
29ab0 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41   OR x2 OR ...) A
29ac0 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e  ND y.    ** Then
29ad0 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
29ae0 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20  xN, evaluate as 
29af0 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
29b00 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20  n: xN AND z.    
29b10 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72  ** That way, ter
29b20 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65  ms in y that are
29b30 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74   factored into t
29b40 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77  he disjunction w
29b50 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69  ill.    ** be pi
29b60 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72  cked up by the r
29b70 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
29b80 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
29b90 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20  gin() below..   
29ba0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61   **.    ** Actua
29bb0 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70  lly, each subexp
29bc0 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65  ression is conve
29bd0 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20  rted to "xN AND 
29be0 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20  w" where w is.  
29bf0 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65    ** the "intere
29c00 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20  sting" terms of 
29c10 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64  z - terms that d
29c20 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
29c30 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   in the.    ** O
29c40 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
29c50 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
29c60 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74  , and terms that
29c70 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a   are usable as .
29c80 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a      ** indices..
29c90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
29ca0 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20  WC->nTerm>1 ){. 
29cb0 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a       int iTerm;.
29cc0 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d        for(iTerm=
29cd0 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54  0; iTerm<pWC->nT
29ce0 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20  erm; iTerm++){. 
29cf0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
29d00 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72  pr = pWC->a[iTer
29d10 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m].pExpr;.      
29d20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
29d30 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
29d40 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74  FromJoin) ) cont
29d50 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
29d60 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
29d70 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
29d80 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 4f 52 49  VIRTUAL|TERM_ORI
29d90 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NFO) ) continue;
29da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
29db0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65  C->a[iTerm].eOpe
29dc0 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d  rator & WO_ALL)=
29dd0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
29de0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
29df0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
29e00 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
29e10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e   0);.        pAn
29e20 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  dExpr = sqlite3E
29e30 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
29e40 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78  b, pAndExpr, pEx
29e50 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
29e60 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
29e70 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  ){.        pAndE
29e80 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
29e90 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e  pr(pParse, TK_AN
29ea0 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20  D, 0, pAndExpr, 
29eb0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
29ec0 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  }..    for(ii=0;
29ed0 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   ii<pOrWc->nTerm
29ee0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57  ; ii++){.      W
29ef0 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
29f00 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69  m = &pOrWc->a[ii
29f10 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ];.      if( pOr
29f20 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
29f30 3d 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54 65 72  ==iCur || pOrTer
29f40 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
29f50 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  _AND ){.        
29f60 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57  WhereInfo *pSubW
29f70 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
29f80 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
29f90 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
29fa0 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
29fb0 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72  pOrExpr = pOrTer
29fc0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
29fd0 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
29fe0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64  {.          pAnd
29ff0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f  Expr->pLeft = pO
2a000 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  rExpr;.         
2a010 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45   pOrExpr = pAndE
2a020 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
2a030 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
2a040 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
2a050 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
2a060 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
2a070 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e  .        pSubWIn
2a080 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
2a090 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
2a0a0 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20  OrTab, pOrExpr, 
2a0b0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
2a0d0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
2a0e0 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f  OSE | WHERE_AND_
2a0f0 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20  ONLY |.         
2a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
2a110 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
2a120 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   | WHERE_ONETABL
2a130 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29  E_ONLY, iCovCur)
2a140 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2a150 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70  ( pSubWInfo || p
2a160 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
2a170 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2a180 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
2a190 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
2a1a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
2a1b0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a  ereLevel *pLvl;.
2a1c0 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
2a1d0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20  nOneScan(.      
2a1e0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
2a1f0 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e  pOrTab, &pSubWIn
2a200 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c  fo->a[0], iLevel
2a210 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
2a220 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a   0.          );.
2a230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
2a240 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2a250 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
2a260 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2a270 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
2a280 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
2a290 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
2a2a0 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
2a2b0 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
2a2c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
2a2d0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
2a2e0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20  pTabItem->pTab, 
2a2f0 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20  -1, iCur, .     
2a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a320 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29      regRowid, 0)
2a330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2a340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2a350 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54  nt(v, OP_RowSetT
2a360 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a  est, regRowset,.
2a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2a3a0 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c  entAddr(v)+2, r,
2a3b0 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20   iSet);.        
2a3c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2a3d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2a3e0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2a3f0 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
2a400 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
2a410 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d  * The pSubWInfo-
2a420 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66  >untestedTerms f
2a430 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
2a440 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20  his OR term.    
2a450 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
2a460 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41  ed one or more A
2a470 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e  ND term from a n
2a480 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20  otReady table.  
2a490 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  The.          **
2a4a0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
2a4b0 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63  notReady table c
2a4c0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74  ould not be test
2a4d0 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20  ed and will.    
2a4e0 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
2a4f0 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72   be tested later
2a500 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
2a510 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
2a520 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
2a530 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64  Terms ) untested
2a540 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20  Terms = 1;..    
2a550 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
2a560 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63  of the OR-connec
2a570 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70  ted terms are op
2a580 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68  timized using th
2a590 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20  e same.         
2a5a0 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   ** index, and t
2a5b0 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  he index is open
2a5c0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
2a5d0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
2a5e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
2a5f0 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c  each call to sql
2a600 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2a610 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f   made by this lo
2a620 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20  op, it may.     
2a630 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69       ** be possi
2a640 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20  ble to use that 
2a650 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72  index as a cover
2a660 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ing index..     
2a670 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2a680 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
2a690 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
2a6a0 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65  Begin() above re
2a6b0 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e  sulted in a scan
2a6c0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
2a6d0 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  ** uses an index
2a6e0 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69  , and this is ei
2a6f0 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f  ther the first O
2a700 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
2a710 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
2a720 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69  ocessed or the i
2a730 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65  ndex is the same
2a740 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79   as that used by
2a750 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20   all previous.  
2a760 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
2a770 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68  , set pCov to th
2a780 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  e candidate cove
2a790 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65  ring index. Othe
2a7a0 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20  rwise, set .    
2a7b0 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f        ** pCov to
2a7c0 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74   NULL to indicat
2a7d0 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64  e that no candid
2a7e0 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
2a7f0 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20  ex will .       
2a800 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62     ** be availab
2a810 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  le..          */
2a820 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c 20  .          pLvl 
2a830 3d 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  = &pSubWInfo->a[
2a840 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0];.          if
2a850 28 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 77 73  ( (pLvl->plan.ws
2a860 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2a870 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
2a880 20 20 20 20 20 26 26 20 28 70 4c 76 6c 2d 3e 70       && (pLvl->p
2a890 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2a8a0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3d  ERE_TEMP_INDEX)=
2a8b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
2a8c0 20 28 69 69 3d 3d 30 20 7c 7c 20 70 4c 76 6c 2d   (ii==0 || pLvl-
2a8d0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 43  >plan.u.pIdx==pC
2a8e0 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ov).          ){
2a8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2a900 65 72 74 28 20 70 4c 76 6c 2d 3e 69 49 64 78 43  ert( pLvl->iIdxC
2a910 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20  ur==iCovCur );. 
2a920 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
2a930 3d 20 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  = pLvl->plan.u.p
2a940 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Idx;.          }
2a950 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a960 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20    pCov = 0;.    
2a970 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2a980 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65     /* Finish the
2a990 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   loop through ta
2a9a0 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
2a9b0 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
2a9c0 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
2a9d0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2a9e0 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20  d(pSubWInfo);.  
2a9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2aa00 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
2aa10 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43  ->u.pCovidx = pC
2aa20 6f 76 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ov;.    pLevel->
2aa30 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75  iIdxCur = iCovCu
2aa40 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45  r;.    if( pAndE
2aa50 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e  xpr ){.      pAn
2aa60 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  dExpr->pLeft = 0
2aa70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2aa80 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
2aa90 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b  ->db, pAndExpr);
2aaa0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2aab0 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
2aac0 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69  , iRetInit, sqli
2aad0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2aae0 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69  dr(v));.    sqli
2aaf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ab00 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
2ab10 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
2ab20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2ab30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c  solveLabel(v, iL
2ab40 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69  oopBody);..    i
2ab50 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
2ab60 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61  l>1 ) sqlite3Sta
2ab70 63 6b 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  ckFree(pParse->d
2ab80 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
2ab90 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
2aba0 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
2abb0 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
2abc0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
2abd0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
2abe0 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
2abf0 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
2ac00 73 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20  se 5:  There is 
2ac10 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
2ac20 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
2ac30 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
2ac40 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
2ac50 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
2ac60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
2ac70 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
2ac80 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
2ac90 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
2aca0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
2acb0 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
2acc0 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
2acd0 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
2ace0 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
2acf0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
2ad00 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
2ad10 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
2ad20 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
2ad30 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
2ad40 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
2ad50 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
2ad60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ad70 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69   aStart[bRev], i
2ad80 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  Cur, addrBrk);. 
2ad90 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
2ada0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
2adb0 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
2adc0 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20  .  }.  notReady 
2add0 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d  &= ~getMask(pWC-
2ade0 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >pMaskSet, iCur)
2adf0 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  ;..  /* Insert c
2ae00 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72  ode to test ever
2ae10 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  y subexpression 
2ae20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70  that can be comp
2ae30 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70  letely.  ** comp
2ae40 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
2ae50 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
2ae60 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
2ae70 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
2ae80 46 3a 20 52 2d 34 39 35 32 35 2d 35 30 39 33 35  F: R-49525-50935
2ae90 20 54 65 72 6d 73 20 74 68 61 74 20 63 61 6e 6e   Terms that cann
2aea0 6f 74 20 62 65 20 73 61 74 69 73 66 69 65 64 20  ot be satisfied 
2aeb0 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65  through.  ** the
2aec0 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 20   use of indices 
2aed0 62 65 63 6f 6d 65 20 74 65 73 74 73 20 74 68 61  become tests tha
2aee0 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  t are evaluated 
2aef0 61 67 61 69 6e 73 74 20 65 61 63 68 20 72 6f 77  against each row
2af00 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 6c   of.  ** the rel
2af10 65 76 61 6e 74 20 69 6e 70 75 74 20 74 61 62 6c  evant input tabl
2af20 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  es..  */.  for(p
2af30 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70  Term=pWC->a, j=p
2af40 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  WC->nTerm; j>0; 
2af50 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
2af60 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
2af70 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
2af80 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
2af90 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49  _VIRTUAL ); /* I
2afa0 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
2afb0 32 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  2 */.    testcas
2afc0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
2afd0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
2afe0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
2aff0 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
2b000 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
2b010 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
2b020 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
2b030 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
2b040 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
2b050 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
2b060 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
2b070 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ms==0.          
2b080 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2b090 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2b0a0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
2b0b0 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  Y)!=0 );.      p
2b0c0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
2b0d0 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  erms = 1;.      
2b0e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2b0f0 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
2b100 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
2b110 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
2b120 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
2b130 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61  tJoin && !ExprHa
2b140 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
2b150 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
2b160 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2b170 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
2b180 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2b190 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c  e, pE, addrCont,
2b1a0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
2b1b0 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  LL);.    pTerm->
2b1c0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
2b1d0 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  CODED;.  }..  /*
2b1e0 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45   For a LEFT OUTE
2b1f0 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65  R JOIN, generate
2b200 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
2b210 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
2b220 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61  that.  ** at lea
2b230 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  st one row of th
2b240 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61  e right table ha
2b250 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65  s matched the le
2b260 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f  ft table.  .  */
2b270 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
2b280 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
2b290 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
2b2a0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
2b2b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2b2c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b2d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2b2e0 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69  er, 1, pLevel->i
2b2f0 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56  LeftJoin);.    V
2b300 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2b310 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e  record LEFT JOIN
2b320 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c   hit"));.    sql
2b330 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2b340 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2b350 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
2b360 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54  , j=0; j<pWC->nT
2b370 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  erm; j++, pTerm+
2b380 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  +){.      testca
2b390 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
2b3a0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
2b3b0 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  L );  /* IMP: R-
2b3c0 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
2b3d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2b3e0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
2b3f0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
2b400 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
2b410 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
2b420 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
2b430 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
2b440 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2b450 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
2b460 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
2b470 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
2b480 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
2b490 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ms );.        co
2b4a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2b4b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2b4c0 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
2b4d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2b4e0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2b4f0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64  Term->pExpr, add
2b500 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
2b510 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
2b520 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
2b530 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
2b540 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
2b550 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2b560 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73  (pParse, iReleas
2b570 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e  eReg);..  return
2b580 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69   notReady;.}..#i
2b590 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2b5a0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65  _TEST)./*.** The
2b5b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
2b5c0 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74  ble holds a text
2b5d0 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
2b5e0 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72  query plan gener
2b5f0 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d  ated.** by the m
2b600 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
2b610 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
2b620 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61  egin().  Each ca
2b630 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e  ll to WhereBegin
2b640 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74  .** overwrites t
2b650 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68  he previous.  Th
2b660 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
2b670 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
2b680 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73  ng and.** analys
2b690 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72  is only..*/.char
2b6a0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
2b6b0 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20  lan[BMS*2*40];  
2b6c0 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a  /* Text of the j
2b6d0 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  oin */.static in
2b6e0 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20  t nQPlan = 0;   
2b6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2b700 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20  xt free slow in 
2b710 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f  _query_plan[] */
2b720 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
2b730 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a  TE_TEST */.../*.
2b740 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49  ** Free a WhereI
2b750 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  nfo structure.*/
2b760 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
2b770 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74  reInfoFree(sqlit
2b780 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66  e3 *db, WhereInf
2b790 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66  o *pWInfo){.  if
2b7a0 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29  ( ALWAYS(pWInfo)
2b7b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2b7c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
2b7d0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
2b7e0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2b7f0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
2b800 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  nfo = pWInfo->a[
2b810 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20  i].pIdxInfo;.   
2b820 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a     if( pInfo ){.
2b830 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72          /* asser
2b840 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  t( pInfo->needTo
2b850 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c  FreeIdxStr==0 ||
2b860 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2b870 64 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  d ); */.        
2b880 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54  if( pInfo->needT
2b890 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20  oFreeIdxStr ){. 
2b8a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b8b0 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78  _free(pInfo->idx
2b8c0 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Str);.        }.
2b8d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2b8e0 62 46 72 65 65 28 64 62 2c 20 70 49 6e 66 6f 29  bFree(db, pInfo)
2b8f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b900 69 66 28 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d  if( pWInfo->a[i]
2b910 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2b920 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2b930 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65   ){.        Inde
2b940 78 20 2a 70 49 64 78 20 3d 20 70 57 49 6e 66 6f  x *pIdx = pWInfo
2b950 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49  ->a[i].plan.u.pI
2b960 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  dx;.        if( 
2b970 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  pIdx ){.        
2b980 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2b990 64 62 2c 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66  db, pIdx->zColAf
2b9a0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  f);.          sq
2b9b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2b9c0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  pIdx);.        }
2b9d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b9e0 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c     whereClauseCl
2b9f0 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29  ear(pWInfo->pWC)
2ba00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
2ba10 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2ba20 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
2ba30 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
2ba40 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
2ba50 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
2ba60 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2ba70 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
2ba80 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
2ba90 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
2baa0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
2bab0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
2bac0 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
2bad0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
2bae0 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
2baf0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
2bb00 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
2bb10 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
2bb20 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
2bb30 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
2bb40 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
2bb50 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
2bb60 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
2bb70 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2bb80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2bb90 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
2bba0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2bbb0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
2bbc0 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
2bbd0 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
2bbe0 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
2bbf0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
2bc00 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
2bc10 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
2bc20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
2bc30 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
2bc40 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
2bc50 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
2bc60 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
2bc70 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
2bc80 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
2bc90 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
2bca0 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
2bcb0 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
2bcc0 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
2bcd0 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
2bce0 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
2bcf0 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
2bd00 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
2bd10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
2bd20 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
2bd30 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
2bd40 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
2bd50 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
2bd60 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
2bd70 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
2bd80 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
2bd90 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
2bda0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
2bdb0 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
2bdc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
2bdd0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
2bde0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
2bdf0 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
2be00 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
2be10 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
2be20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2be30 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
2be40 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
2be50 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
2be60 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
2be70 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
2be80 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
2be90 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
2bea0 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
2beb0 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
2bec0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2bed0 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
2bee0 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
2bef0 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
2bf00 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
2bf10 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
2bf20 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
2bf30 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
2bf40 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
2bf50 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
2bf60 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
2bf70 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
2bf80 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
2bf90 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
2bfa0 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
2bfb0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
2bfc0 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
2bfd0 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
2bfe0 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
2bff0 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
2c000 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
2c010 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
2c020 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
2c030 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
2c040 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
2c050 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
2c060 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
2c070 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
2c080 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
2c090 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
2c0a0 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
2c0b0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2c0c0 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
2c0d0 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
2c0e0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
2c0f0 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
2c100 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
2c110 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
2c120 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
2c130 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
2c140 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
2c150 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
2c160 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
2c170 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
2c180 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
2c190 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
2c1a0 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
2c1b0 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
2c1c0 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
2c1d0 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
2c1e0 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
2c1f0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c200 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
2c210 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
2c220 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
2c230 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
2c240 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
2c250 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
2c260 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
2c270 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
2c280 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
2c290 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
2c2a0 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
2c2b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2c2c0 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
2c2d0 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
2c2e0 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
2c2f0 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
2c300 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
2c310 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
2c320 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
2c330 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
2c340 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2c350 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
2c360 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
2c370 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
2c380 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
2c390 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
2c3a0 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
2c3b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
2c3c0 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
2c3d0 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
2c3e0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
2c3f0 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
2c400 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
2c410 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
2c420 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
2c430 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
2c440 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2c450 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
2c460 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
2c470 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
2c480 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
2c490 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
2c4a0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
2c4b0 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
2c4c0 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
2c4d0 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
2c4e0 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
2c4f0 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
2c500 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
2c510 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
2c520 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
2c530 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
2c540 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
2c550 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
2c560 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
2c570 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
2c580 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
2c590 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
2c5a0 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
2c5b0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
2c5c0 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
2c5d0 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
2c5e0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
2c5f0 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
2c600 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
2c610 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
2c620 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
2c630 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
2c640 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
2c650 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
2c660 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
2c670 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
2c680 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
2c690 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  SSING.**.** pOrd
2c6a0 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
2c6b0 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
2c6c0 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  Y clause of a SE
2c6d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a  LECT statement,.
2c6e0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
2c6f0 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
2c700 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
2c710 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
2c720 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
2c730 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
2c740 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
2c750 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72  tement, then pOr
2c760 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
2c770 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78  *.** If an index
2c780 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20   can be used so 
2c790 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c  that the natural
2c7a0 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66   output order of
2c7b0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63   the table.** sc
2c7c0 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f  an is correct fo
2c7d0 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
2c7e0 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74  lause, then that
2c7f0 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61   index is used a
2c800 6e 64 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  nd.** the return
2c810 65 64 20 57 68 65 72 65 49 6e 66 6f 2e 6e 4f 42  ed WhereInfo.nOB
2c820 53 61 74 20 66 69 65 6c 64 20 69 73 20 73 65 74  Sat field is set
2c830 20 74 6f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45   to pOrderBy->nE
2c840 78 70 72 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  xpr.  This.** is
2c850 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2c860 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61   that prevents a
2c870 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f  n unnecessary so
2c880 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
2c890 20 73 65 74 0a 2a 2a 20 69 66 20 61 6e 20 69 6e   set.** if an in
2c8a0 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20  dex appropriate 
2c8b0 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
2c8c0 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
2c8d0 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  exists..**.** If
2c8e0 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   the where claus
2c8f0 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62  e loops cannot b
2c900 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72  e arranged to pr
2c910 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63  ovide the correc
2c920 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65  t.** output orde
2c930 72 2c 20 74 68 65 6e 20 57 68 65 72 65 49 6e 66  r, then WhereInf
2c940 6f 2e 6e 4f 42 53 61 74 20 69 73 20 30 2e 0a 2a  o.nOBSat is 0..*
2c950 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
2c960 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
2c970 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2c980 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2c990 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
2c9a0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2c9b0 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69  List,    /* A li
2c9c0 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
2c9d0 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
2c9e0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
2c9f0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2ca00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2ca10 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
2ca20 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f  derBy,   /* An O
2ca30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2ca40 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  or NULL */.  Exp
2ca50 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
2ca60 2c 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74  ,  /* The select
2ca70 2d 6c 69 73 74 20 66 6f 72 20 44 49 53 54 49 4e  -list for DISTIN
2ca80 43 54 20 71 75 65 72 69 65 73 20 2d 20 6f 72 20  CT queries - or 
2ca90 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63  NULL */.  u16 wc
2caa0 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
2cab0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
2cac0 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
2cad0 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
2cae0 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  .h */.  int iIdx
2caf0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur           /*
2cb00 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   If WHERE_ONETAB
2cb10 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
2cb20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d  index cursor num
2cb30 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ber */.){.  int 
2cb40 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20  nByteWInfo;     
2cb50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62         /* Num. b
2cb60 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
2cb70 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  or WhereInfo str
2cb80 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  uct */.  int nTa
2cb90 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
2cba0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2cbb0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61   elements in pTa
2cbc0 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
2cbd0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2cbe0 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
2cbf0 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
2cc00 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
2cc10 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
2cc20 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2cc30 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
2cc40 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
2cc50 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
2cc60 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
2cc70 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
2cc80 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
2cc90 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
2cca0 20 20 57 68 65 72 65 42 65 73 74 49 64 78 20 73    WhereBestIdx s
2ccb0 57 42 49 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  WBI;         /* 
2ccc0 42 65 73 74 20 69 6e 64 65 78 20 73 65 61 72 63  Best index searc
2ccd0 68 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  h context */.  W
2cce0 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
2ccf0 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65  skSet;    /* The
2cd00 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
2cd10 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c   set */.  WhereL
2cd20 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
2cd30 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
2cd40 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f   level in pWInfo
2cd50 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ->a[] */.  int i
2cd60 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
2cd70 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
2cd80 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73  nused FROM claus
2cd90 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  e element */.  i
2cda0 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20  nt andFlags;    
2cdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44            /* AND
2cdc0 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
2cdd0 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e  of all pWC->a[].
2cde0 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  wtFlags */.  int
2cdf0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
2ce00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ce10 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
2ce20 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
2ce30 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2ce40 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2ce50 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  /...  /* Variabl
2ce60 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
2ce70 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 57   */.  memset(&sW
2ce80 42 49 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  BI, 0, sizeof(sW
2ce90 42 49 29 29 3b 0a 20 20 73 57 42 49 2e 70 50 61  BI));.  sWBI.pPa
2cea0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 0a 20  rse = pParse;.. 
2ceb0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
2cec0 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
2ced0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
2cee0 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75  imited by the nu
2cef0 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74  mber of.  ** bit
2cf00 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a  s in a Bitmask .
2cf10 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
2cf20 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d   pTabList->nSrc=
2cf30 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54  =BMS );.  if( pT
2cf40 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53  abList->nSrc>BMS
2cf50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2cf60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2cf70 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c  "at most %d tabl
2cf80 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42  es in a join", B
2cf90 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MS);.    return 
2cfa0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  0;.  }..  /* Thi
2cfb0 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61  s function norma
2cfc0 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20  lly generates a 
2cfd0 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20  nested loop for 
2cfe0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20  all tables in . 
2cff0 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42   ** pTabList.  B
2d000 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ut if the WHERE_
2d010 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
2d020 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
2d030 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f  we should.  ** o
2d040 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64  nly generate cod
2d050 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  e for the first 
2d060 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73  table in pTabLis
2d070 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61  t and assume tha
2d080 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f  t.  ** any curso
2d090 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
2d0a0 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61  th subsequent ta
2d0b0 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69  bles are uniniti
2d0c0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e  alized..  */.  n
2d0d0 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c  TabList = (wctrl
2d0e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2d0f0 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31  ETABLE_ONLY) ? 1
2d100 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   : pTabList->nSr
2d110 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  c;..  /* Allocat
2d120 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2d130 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
2d140 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
2d150 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20  ll become the.  
2d160 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ** return value.
2d170 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   A single alloca
2d180 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2d190 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49  store the WhereI
2d1a0 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c  nfo.  ** struct,
2d1b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2d1c0 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20   WhereInfo.a[], 
2d1d0 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
2d1e0 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
2d1f0 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b  nd the WhereMask
2d200 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53  Set structure. S
2d210 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65  ince WhereClause
2d220 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62   contains an 8-b
2d230 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28  yte.  ** field (
2d240 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74  type Bitmask) it
2d250 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64   must be aligned
2d260 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   on an 8-byte bo
2d270 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73  undary on.  ** s
2d280 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ome architecture
2d290 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55  s. Hence the ROU
2d2a0 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a  ND8() below..  *
2d2b0 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
2d2c0 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66  >db;.  nByteWInf
2d2d0 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  o = ROUND8(sizeo
2d2e0 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54  f(WhereInfo)+(nT
2d2f0 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66  abList-1)*sizeof
2d300 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20  (WhereLevel));. 
2d310 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
2d320 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
2d330 2c 20 0a 20 20 20 20 20 20 6e 42 79 74 65 57 49  , .      nByteWI
2d340 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20 73 69 7a  nfo + .      siz
2d350 65 6f 66 28 57 68 65 72 65 43 6c 61 75 73 65 29  eof(WhereClause)
2d360 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28   +.      sizeof(
2d370 57 68 65 72 65 4d 61 73 6b 53 65 74 29 0a 20 20  WhereMaskSet).  
2d380 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
2d390 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2d3a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2d3b0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  b, pWInfo);.    
2d3c0 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pWInfo = 0;.    
2d3d0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2d3e0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  rror;.  }.  pWIn
2d3f0 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61  fo->nLevel = nTa
2d400 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
2d410 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  >pParse = pParse
2d420 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  ;.  pWInfo->pTab
2d430 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
2d440 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  .  pWInfo->iBrea
2d450 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
2d460 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
2d470 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 73 57 42  WInfo->pWC = sWB
2d480 49 2e 70 57 43 20 3d 20 28 57 68 65 72 65 43 6c  I.pWC = (WhereCl
2d490 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29 70  ause *)&((u8 *)p
2d4a0 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66  WInfo)[nByteWInf
2d4b0 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  o];.  pWInfo->wc
2d4c0 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
2d4d0 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
2d4e0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2d4f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
2d500 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65  yLoop;.  pMaskSe
2d510 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53 65  t = (WhereMaskSe
2d520 74 2a 29 26 73 57 42 49 2e 70 57 43 5b 31 5d 3b  t*)&sWBI.pWC[1];
2d530 0a 20 20 73 57 42 49 2e 61 4c 65 76 65 6c 20 3d  .  sWBI.aLevel =
2d540 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 0a 20 20 2f   pWInfo->a;..  /
2d550 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
2d560 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
2d570 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
2d580 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
2d590 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
2d5a0 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
2d5b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2d5c0 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
2d5d0 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
2d5e0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
2d5f0 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
2d600 4f 70 74 29 20 29 20 70 44 69 73 74 69 6e 63 74  Opt) ) pDistinct
2d610 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69   = 0;..  /* Spli
2d620 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
2d630 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
2d640 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
2d650 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
2d660 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
2d670 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
2d680 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
2d690 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
2d6a0 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77  t(pMaskSet);.  w
2d6b0 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 73  hereClauseInit(s
2d6c0 57 42 49 2e 70 57 43 2c 20 70 50 61 72 73 65 2c  WBI.pWC, pParse,
2d6d0 20 70 4d 61 73 6b 53 65 74 2c 20 77 63 74 72 6c   pMaskSet, wctrl
2d6e0 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  Flags);.  sqlite
2d6f0 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e  3ExprCodeConstan
2d700 74 73 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  ts(pParse, pWher
2d710 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  e);.  whereSplit
2d720 28 73 57 42 49 2e 70 57 43 2c 20 70 57 68 65 72  (sWBI.pWC, pWher
2d730 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a  e, TK_AND);   /*
2d740 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33   IMP: R-15842-53
2d750 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a  296 */.    .  /*
2d760 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
2d770 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2d780 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
2d790 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
2d7a0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
2d7b0 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
2d7c0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
2d7d0 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
2d7e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
2d7f0 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d  re && (nTabList=
2d800 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
2d810 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
2d820 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  in(pWhere)) ){. 
2d830 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
2d840 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
2d850 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
2d860 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  reak, SQLITE_JUM
2d870 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57  PIFNULL);.    pW
2d880 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
2d890 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
2d8a0 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
2d8b0 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
2d8c0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2d8d0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
2d8e0 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
2d8f0 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
2d900 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
2d910 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
2d920 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
2d930 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
2d940 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
2d950 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
2d960 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
2d970 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
2d980 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
2d990 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
2d9a0 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
2d9b0 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
2d9c0 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
2d9d0 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
2d9e0 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
2d9f0 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
2da00 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
2da10 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
2da20 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
2da30 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
2da40 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
2da50 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
2da60 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
2da70 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
2da80 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
2da90 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
2daa0 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
2dab0 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
2dac0 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
2dad0 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
2dae0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
2daf0 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
2db00 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
2db10 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
2db20 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e  5..  **.  ** Con
2db30 66 69 67 75 72 65 20 74 68 65 20 57 68 65 72 65  figure the Where
2db40 43 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76 61 72  Clause.vmask var
2db50 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 62 69  iable so that bi
2db60 74 73 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  ts that correspo
2db70 6e 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74 75  nd.  ** to virtu
2db80 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73  al table cursors
2db90 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 69   are set. This i
2dba0 73 20 75 73 65 64 20 74 6f 20 73 65 6c 65 63 74  s used to select
2dbb0 69 76 65 6c 79 20 64 69 73 61 62 6c 65 20 0a 20  ively disable . 
2dbc0 20 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e   ** the OR-to-IN
2dbd0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
2dbe0 69 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  in exprAnalyzeOr
2dbf0 54 65 72 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f  Term(). It is no
2dc00 74 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20  t helpful .  ** 
2dc10 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62  with virtual tab
2dc20 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  les..  **.  ** N
2dc30 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
2dc40 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
2dc50 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
2dc60 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
2dc70 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
2dc80 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
2dc90 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
2dca0 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
2dcb0 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
2dcc0 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
2dcd0 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
2dce0 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
2dcf0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
2dd00 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2dd10 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
2dd20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 57 42  */.  assert( sWB
2dd30 49 2e 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20  I.pWC->vmask==0 
2dd40 26 26 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d  && pMaskSet->n==
2dd50 30 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  0 );.  for(ii=0;
2dd60 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
2dd70 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63  rc; ii++){.    c
2dd80 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53  reateMask(pMaskS
2dd90 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2dda0 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 23 69  ii].iCursor);.#i
2ddb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ddc0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2ddd0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54     if( ALWAYS(pT
2dde0 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 54  abList->a[ii].pT
2ddf0 61 62 29 20 26 26 20 49 73 56 69 72 74 75 61 6c  ab) && IsVirtual
2de00 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d  (pTabList->a[ii]
2de10 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  .pTab) ){.      
2de20 73 57 42 49 2e 70 57 43 2d 3e 76 6d 61 73 6b 20  sWBI.pWC->vmask 
2de30 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 20 3c  |= ((Bitmask)1 <
2de40 3c 20 69 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  < ii);.    }.#en
2de50 64 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  dif.  }.#ifndef 
2de60 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42  NDEBUG.  {.    B
2de70 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74  itmask toTheLeft
2de80 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
2de90 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d  =0; ii<pTabList-
2dea0 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nSrc; ii++){.  
2deb0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
2dec0 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
2ded0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
2dee0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
2def0 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d    assert( (m-1)=
2df00 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20  =toTheLeft );.  
2df10 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d      toTheLeft |=
2df20 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   m;.    }.  }.#e
2df30 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  ndif..  /* Analy
2df40 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
2df50 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e  bexpressions.  N
2df60 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61  ote that exprAna
2df70 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a  lyze() might.  *
2df80 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61  * add new virtua
2df90 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65  l terms onto the
2dfa0 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
2dfb0 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f  E clause.  We do
2dfc0 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74   not.  ** want t
2dfd0 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20  o analyze these 
2dfe0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73  virtual terms, s
2dff0 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e  o start analyzin
2e000 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  g at the end.  *
2e010 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61  * and work forwa
2e020 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61  rd so that the a
2e030 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72  dded virtual ter
2e040 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f  ms are never pro
2e050 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  cessed..  */.  e
2e060 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54  xprAnalyzeAll(pT
2e070 61 62 4c 69 73 74 2c 20 73 57 42 49 2e 70 57 43  abList, sWBI.pWC
2e080 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
2e090 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2e0a0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2e0b0 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
2e0c0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 44 49   Check if the DI
2e0d0 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
2e0e0 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
2e0f0 65 2c 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  e, is redundant.
2e100 20 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c   .  ** If it is,
2e110 20 74 68 65 6e 20 73 65 74 20 70 44 69 73 74 69   then set pDisti
2e120 6e 63 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  nct to NULL and 
2e130 57 68 65 72 65 49 6e 66 6f 2e 65 44 69 73 74 69  WhereInfo.eDisti
2e140 6e 63 74 20 74 6f 0a 20 20 2a 2a 20 57 48 45 52  nct to.  ** WHER
2e150 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
2e160 45 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 63 61  E to tell the ca
2e170 6c 6c 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74  ller to ignore t
2e180 68 65 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a  he DISTINCT..  *
2e190 2f 0a 20 20 69 66 28 20 70 44 69 73 74 69 6e 63  /.  if( pDistinc
2e1a0 74 20 26 26 20 69 73 44 69 73 74 69 6e 63 74 52  t && isDistinctR
2e1b0 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c  edundant(pParse,
2e1c0 20 70 54 61 62 4c 69 73 74 2c 20 73 57 42 49 2e   pTabList, sWBI.
2e1d0 70 57 43 2c 20 70 44 69 73 74 69 6e 63 74 29 20  pWC, pDistinct) 
2e1e0 29 7b 0a 20 20 20 20 70 44 69 73 74 69 6e 63 74  ){.    pDistinct
2e1f0 20 3d 20 30 3b 0a 20 20 20 20 70 57 49 6e 66 6f   = 0;.    pWInfo
2e200 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
2e210 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
2e220 51 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  QUE;.  }..  /* C
2e230 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e  hose the best in
2e240 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65  dex to use for e
2e250 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ach table in the
2e260 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
2e270 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
2e280 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66  p fills in the f
2e290 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
2e2a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49  .  **.  **   pWI
2e2b0 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20  nfo->a[].pIdx   
2e2c0 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20     The index to 
2e2d0 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76  use for this lev
2e2e0 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  el of the loop..
2e2f0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
2e300 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57 48 45  [].wsFlags   WHE
2e310 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73  RE_xxx flags ass
2e320 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
2e330 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  x.  **   pWInfo-
2e340 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54  >a[].nEq       T
2e350 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
2e360 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
2e370 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ts.  **   pWInfo
2e380 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20  ->a[].iFrom     
2e390 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20 74 68  Which term of th
2e3a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2e3b0 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a   being coded.  *
2e3c0 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
2e3d0 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44  iTabCur   The VD
2e3e0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
2e3f0 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
2e400 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2e410 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68  a[].iIdxCur   Th
2e420 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
2e430 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  r the index.  **
2e440 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70     pWInfo->a[].p
2e450 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20 77 73  Term     When ws
2e460 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68  Flags==WO_OR, th
2e470 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65 72 6d  e OR-clause term
2e480 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
2e490 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65  loop also figure
2e4a0 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e  s out the nestin
2e4b0 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65  g order of table
2e4c0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
2e4d0 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
2e4e0 20 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 20    sWBI.notValid 
2e4f0 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
2e500 20 73 57 42 49 2e 70 4f 72 64 65 72 42 79 20 3d   sWBI.pOrderBy =
2e510 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 73 57 42   pOrderBy;.  sWB
2e520 49 2e 6e 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a  I.n = nTabList;.
2e530 20 20 73 57 42 49 2e 70 44 69 73 74 69 6e 63 74    sWBI.pDistinct
2e540 20 3d 20 70 44 69 73 74 69 6e 63 74 3b 0a 20 20   = pDistinct;.  
2e550 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20  andFlags = ~0;. 
2e560 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
2e570 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72  * Optimizer Star
2e580 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f  t ***\n"));.  fo
2e590 72 28 73 57 42 49 2e 69 3d 69 46 72 6f 6d 3d 30  r(sWBI.i=iFrom=0
2e5a0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
2e5b0 3e 61 3b 20 73 57 42 49 2e 69 3c 6e 54 61 62 4c  >a; sWBI.i<nTabL
2e5c0 69 73 74 3b 20 73 57 42 49 2e 69 2b 2b 2c 20 70  ist; sWBI.i++, p
2e5d0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68  Level++){.    Wh
2e5e0 65 72 65 43 6f 73 74 20 62 65 73 74 50 6c 61 6e  ereCost bestPlan
2e5f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73  ;         /* Mos
2e600 74 20 65 66 66 69 63 69 65 6e 74 20 70 6c 61 6e  t efficient plan
2e610 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
2e620 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
2e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e640 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f  /* Index for FRO
2e650 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61 62 49  M table at pTabI
2e660 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  tem */.    int j
2e670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e680 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
2e690 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20  oping over FROM 
2e6a0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e  tables */.    in
2e6b0 74 20 62 65 73 74 4a 20 3d 20 2d 31 3b 20 20 20  t bestJ = -1;   
2e6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2e6d0 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20   value of j */. 
2e6e0 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20     Bitmask m;   
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e700 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20  * Bitmask value 
2e710 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a  for j or bestJ *
2e720 2f 0a 20 20 20 20 69 6e 74 20 69 73 4f 70 74 69  /.    int isOpti
2e730 6d 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  mal;            
2e740 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
2e750 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70  r optimal/non-op
2e760 74 69 6d 61 6c 20 73 65 61 72 63 68 20 2a 2f 0a  timal search */.
2e770 20 20 20 20 69 6e 74 20 6e 55 6e 63 6f 6e 73 74      int nUnconst
2e780 72 61 69 6e 65 64 3b 20 20 20 20 20 20 20 20 20  rained;         
2e790 2f 2a 20 4e 75 6d 62 65 72 20 74 61 62 6c 65 73  /* Number tables
2e7a0 20 77 69 74 68 6f 75 74 20 49 4e 44 45 58 45 44   without INDEXED
2e7b0 20 42 59 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61   BY */.    Bitma
2e7c0 73 6b 20 6e 6f 74 49 6e 64 65 78 65 64 3b 20 20  sk notIndexed;  
2e7d0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2e7e0 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 63 61  f tables that ca
2e7f0 6e 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65  nnot use an inde
2e800 78 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74  x */..    memset
2e810 28 26 62 65 73 74 50 6c 61 6e 2c 20 30 2c 20 73  (&bestPlan, 0, s
2e820 69 7a 65 6f 66 28 62 65 73 74 50 6c 61 6e 29 29  izeof(bestPlan))
2e830 3b 0a 20 20 20 20 62 65 73 74 50 6c 61 6e 2e 72  ;.    bestPlan.r
2e840 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
2e850 47 5f 44 42 4c 3b 0a 20 20 20 20 57 48 45 52 45  G_DBL;.    WHERE
2e860 54 52 41 43 45 28 28 22 2a 2a 2a 20 42 65 67 69  TRACE(("*** Begi
2e870 6e 20 73 65 61 72 63 68 20 66 6f 72 20 6c 6f 6f  n search for loo
2e880 70 20 25 64 20 2a 2a 2a 5c 6e 22 2c 20 73 57 42  p %d ***\n", sWB
2e890 49 2e 69 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  I.i));..    /* L
2e8a0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
2e8b0 72 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69 65  remaining entrie
2e8c0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2e8d0 61 75 73 65 20 74 6f 20 66 69 6e 64 20 74 68 65  ause to find the
2e8e0 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65 73  .    ** next nes
2e8f0 74 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f  ted loop. The lo
2e900 6f 70 20 74 65 73 74 73 20 61 6c 6c 20 46 52 4f  op tests all FRO
2e910 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73  M clause entries
2e920 0a 20 20 20 20 2a 2a 20 65 69 74 68 65 72 20 6f  .    ** either o
2e930 6e 63 65 20 6f 72 20 74 77 69 63 65 2e 20 0a 20  nce or twice. . 
2e940 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2e950 20 66 69 72 73 74 20 74 65 73 74 20 69 73 20 61   first test is a
2e960 6c 77 61 79 73 20 70 65 72 66 6f 72 6d 65 64 20  lways performed 
2e970 69 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  if there are two
2e980 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65 73   or more entries
2e990 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e 69 6e  .    ** remainin
2e9a0 67 20 61 6e 64 20 6e 65 76 65 72 20 70 65 72 66  g and never perf
2e9b0 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65 20 69  ormed if there i
2e9c0 73 20 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d 20  s only one FROM 
2e9d0 63 6c 61 75 73 65 20 65 6e 74 72 79 0a 20 20 20  clause entry.   
2e9e0 20 2a 2a 20 74 6f 20 63 68 6f 6f 73 65 20 66 72   ** to choose fr
2e9f0 6f 6d 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  om.  The first t
2ea00 65 73 74 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e  est looks for an
2ea10 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e   "optimal" scan.
2ea20 20 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73    In.    ** this
2ea30 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74 69   context an opti
2ea40 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65 20  mal scan is one 
2ea50 74 68 61 74 20 75 73 65 73 20 74 68 65 20 73 61  that uses the sa
2ea60 6d 65 20 73 74 72 61 74 65 67 79 0a 20 20 20 20  me strategy.    
2ea70 2a 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ** for the given
2ea80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
2ea90 72 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73  ry as would be s
2eaa0 65 6c 65 63 74 65 64 20 69 66 20 74 68 65 20 65  elected if the e
2eab0 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72 65  ntry.    ** were
2eac0 20 75 73 65 64 20 61 73 20 74 68 65 20 69 6e 6e   used as the inn
2ead0 65 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f  ermost nested lo
2eae0 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  op.  In other wo
2eaf0 72 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20 20  rds, a table.   
2eb00 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73 75   ** is chosen su
2eb10 63 68 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  ch that the cost
2eb20 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61 74   of running that
2eb30 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65   table cannot be
2eb40 20 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a 20   reduced.    ** 
2eb50 62 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20 6f  by waiting for o
2eb60 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 72  ther tables to r
2eb70 75 6e 20 66 69 72 73 74 2e 20 20 54 68 69 73 20  un first.  This 
2eb80 22 6f 70 74 69 6d 61 6c 22 20 74 65 73 74 20 77  "optimal" test w
2eb90 6f 72 6b 73 0a 20 20 20 20 2a 2a 20 62 79 20 66  orks.    ** by f
2eba0 69 72 73 74 20 61 73 73 75 6d 69 6e 67 20 74 68  irst assuming th
2ebb0 61 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  at the FROM clau
2ebc0 73 65 20 69 73 20 6f 6e 20 74 68 65 20 69 6e 6e  se is on the inn
2ebd0 65 72 20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e 64  er loop and find
2ebe0 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 73 20 71  ing.    ** its q
2ebf0 75 65 72 79 20 70 6c 61 6e 2c 20 74 68 65 6e 20  uery plan, then 
2ec00 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20  checking to see 
2ec10 69 66 20 74 68 61 74 20 71 75 65 72 79 20 70 6c  if that query pl
2ec20 61 6e 20 75 73 65 73 20 61 6e 79 0a 20 20 20 20  an uses any.    
2ec30 2a 2a 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  ** other FROM cl
2ec40 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
2ec50 61 72 65 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69  are sWBI.notVali
2ec60 64 2e 20 20 49 66 20 6e 6f 20 6e 6f 74 56 61 6c  d.  If no notVal
2ec70 69 64 20 74 65 72 6d 73 0a 20 20 20 20 2a 2a 20  id terms.    ** 
2ec80 61 72 65 20 75 73 65 64 20 74 68 65 6e 20 74 68  are used then th
2ec90 65 20 22 6f 70 74 69 6d 61 6c 22 20 71 75 65 72  e "optimal" quer
2eca0 79 20 70 6c 61 6e 20 77 6f 72 6b 73 2e 0a 20 20  y plan works..  
2ecb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
2ecc0 20 74 68 61 74 20 74 68 65 20 57 68 65 72 65 43   that the WhereC
2ecd0 6f 73 74 2e 6e 52 6f 77 20 70 61 72 61 6d 65 74  ost.nRow paramet
2ece0 65 72 20 66 6f 72 20 61 6e 20 6f 70 74 69 6d 61  er for an optima
2ecf0 6c 20 73 63 61 6e 20 6d 69 67 68 74 0a 20 20 20  l scan might.   
2ed00 20 2a 2a 20 6e 6f 74 20 62 65 20 61 73 20 73 6d   ** not be as sm
2ed10 61 6c 6c 20 61 73 20 69 74 20 77 6f 75 6c 64 20  all as it would 
2ed20 62 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  be if the table 
2ed30 72 65 61 6c 6c 79 20 77 65 72 65 20 74 68 65 20  really were the 
2ed40 69 6e 6e 65 72 6d 6f 73 74 0a 20 20 20 20 2a 2a  innermost.    **
2ed50 20 6a 6f 69 6e 2e 20 20 54 68 65 20 6e 52 6f 77   join.  The nRow
2ed60 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65   value can be re
2ed70 64 75 63 65 64 20 62 79 20 57 48 45 52 45 20 63  duced by WHERE c
2ed80 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
2ed90 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  s.    ** that do
2eda0 20 6e 6f 74 20 75 73 65 20 69 6e 64 69 63 65 73   not use indices
2edb0 2e 20 20 42 75 74 20 74 68 69 73 20 6e 52 6f 77  .  But this nRow
2edc0 20 72 65 64 75 63 74 69 6f 6e 20 6f 6e 6c 79 20   reduction only 
2edd0 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 0a 20  happens if the. 
2ede0 20 20 20 2a 2a 20 74 61 62 6c 65 20 72 65 61 6c     ** table real
2edf0 6c 79 20 69 73 20 74 68 65 20 69 6e 6e 65 72 6d  ly is the innerm
2ee00 6f 73 74 20 6a 6f 69 6e 2e 20 20 0a 20 20 20 20  ost join.  .    
2ee10 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65  **.    ** The se
2ee20 63 6f 6e 64 20 6c 6f 6f 70 20 69 74 65 72 61 74  cond loop iterat
2ee30 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 70 65 72 66  ion is only perf
2ee40 6f 72 6d 65 64 20 69 66 20 6e 6f 20 6f 70 74 69  ormed if no opti
2ee50 6d 61 6c 20 73 63 61 6e 0a 20 20 20 20 2a 2a 20  mal scan.    ** 
2ee60 73 74 72 61 74 65 67 69 65 73 20 77 65 72 65 20  strategies were 
2ee70 66 6f 75 6e 64 20 62 79 20 74 68 65 20 66 69 72  found by the fir
2ee80 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68  st iteration. Th
2ee90 69 73 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  is second iterat
2eea0 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 75 73  ion.    ** is us
2eeb0 65 64 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ed to search for
2eec0 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
2eed0 20 73 63 61 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20   scan overall.. 
2eee0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 72 65     **.    ** Pre
2eef0 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
2ef00 66 20 53 51 4c 69 74 65 20 70 65 72 66 6f 72 6d  f SQLite perform
2ef10 65 64 20 6f 6e 6c 79 20 74 68 65 20 73 65 63 6f  ed only the seco
2ef20 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2d 0a 20  nd iteration -. 
2ef30 20 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 6f     ** the next o
2ef40 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 77 61  utermost loop wa
2ef50 73 20 61 6c 77 61 79 73 20 74 68 61 74 20 77 69  s always that wi
2ef60 74 68 20 74 68 65 20 6c 6f 77 65 73 74 20 6f 76  th the lowest ov
2ef70 65 72 61 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 73  erall.    ** cos
2ef80 74 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73  t. However, this
2ef90 20 6d 65 61 6e 74 20 74 68 61 74 20 53 51 4c 69   meant that SQLi
2efa0 74 65 20 63 6f 75 6c 64 20 73 65 6c 65 63 74 20  te could select 
2efb0 74 68 65 20 77 72 6f 6e 67 20 70 6c 61 6e 0a 20  the wrong plan. 
2efc0 20 20 20 2a 2a 20 66 6f 72 20 73 63 72 69 70 74     ** for script
2efd0 73 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f  s such as the fo
2efe0 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a 20  llowing:.    ** 
2eff0 20 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41    .    **   CREA
2f000 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
2f010 29 3b 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  ); .    **   CRE
2f020 41 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c 20  ATE TABLE t2(c, 
2f030 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c  d);.    **   SEL
2f040 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 2c 20 74  ECT * FROM t2, t
2f050 31 20 57 48 45 52 45 20 74 32 2e 72 6f 77 69 64  1 WHERE t2.rowid
2f060 20 3d 20 74 31 2e 61 3b 0a 20 20 20 20 2a 2a 0a   = t1.a;.    **.
2f070 20 20 20 20 2a 2a 20 54 68 65 20 62 65 73 74 20      ** The best 
2f080 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 69  strategy is to i
2f090 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
2f0a0 61 62 6c 65 20 74 31 20 66 69 72 73 74 2e 20 48  able t1 first. H
2f0b0 6f 77 65 76 65 72 20 69 74 0a 20 20 20 20 2a 2a  owever it.    **
2f0c0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
2f0d0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2f0e0 69 73 20 77 69 74 68 20 61 20 73 69 6d 70 6c 65  is with a simple
2f0f0 20 67 72 65 65 64 79 20 61 6c 67 6f 72 69 74 68   greedy algorith
2f100 6d 2e 0a 20 20 20 20 2a 2a 20 53 69 6e 63 65 20  m..    ** Since 
2f110 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69  the cost of a li
2f120 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
2f130 68 20 74 61 62 6c 65 20 74 32 20 69 73 20 74 68  h table t2 is th
2f140 65 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20 61  e same .    ** a
2f150 73 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20  s the cost of a 
2f160 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
2f170 75 67 68 20 74 61 62 6c 65 20 74 31 2c 20 61 20  ugh table t1, a 
2f180 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20 0a 20  simple greedy . 
2f190 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 20     ** algorithm 
2f1a0 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 75 73  may choose to us
2f1b0 65 20 74 32 20 66 6f 72 20 74 68 65 20 6f 75 74  e t2 for the out
2f1c0 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68 20 69  er loop, which i
2f1d0 73 20 61 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20  s a much.    ** 
2f1e0 63 6f 73 74 6c 69 65 72 20 61 70 70 72 6f 61 63  costlier approac
2f1f0 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 55  h..    */.    nU
2f200 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 3d 20 30  nconstrained = 0
2f210 3b 0a 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64  ;.    notIndexed
2f220 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 73   = 0;.    for(is
2f230 4f 70 74 69 6d 61 6c 3d 28 69 46 72 6f 6d 3c 6e  Optimal=(iFrom<n
2f240 54 61 62 4c 69 73 74 2d 31 29 3b 20 69 73 4f 70  TabList-1); isOp
2f250 74 69 6d 61 6c 3e 3d 30 20 26 26 20 62 65 73 74  timal>=0 && best
2f260 4a 3c 30 3b 20 69 73 4f 70 74 69 6d 61 6c 2d 2d  J<0; isOptimal--
2f270 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69  ){.      for(j=i
2f280 46 72 6f 6d 2c 20 73 57 42 49 2e 70 53 72 63 3d  From, sWBI.pSrc=
2f290 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b  &pTabList->a[j];
2f2a0 20 6a 3c 6e 54 61 62 4c 69 73 74 3b 20 6a 2b 2b   j<nTabList; j++
2f2b0 2c 20 73 57 42 49 2e 70 53 72 63 2b 2b 29 7b 0a  , sWBI.pSrc++){.
2f2c0 20 20 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f          int doNo
2f2d0 74 52 65 6f 72 64 65 72 3b 20 20 20 20 2f 2a 20  tReorder;    /* 
2f2e0 54 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62  True if this tab
2f2f0 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  le should not be
2f300 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20   reordered */.  
2f310 0a 20 20 20 20 20 20 20 20 64 6f 4e 6f 74 52 65  .        doNotRe
2f320 6f 72 64 65 72 20 3d 20 20 28 73 57 42 49 2e 70  order =  (sWBI.p
2f330 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
2f340 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
2f350 53 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  S))!=0;.        
2f360 69 66 28 20 6a 21 3d 69 46 72 6f 6d 20 26 26 20  if( j!=iFrom && 
2f370 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
2f380 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6d 20  reak;.        m 
2f390 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
2f3a0 65 74 2c 20 73 57 42 49 2e 70 53 72 63 2d 3e 69  et, sWBI.pSrc->i
2f3b0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
2f3c0 20 69 66 28 20 28 6d 20 26 20 73 57 42 49 2e 6e   if( (m & sWBI.n
2f3d0 6f 74 56 61 6c 69 64 29 3d 3d 30 20 29 7b 0a 20  otValid)==0 ){. 
2f3e0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
2f3f0 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b  iFrom ) iFrom++;
2f400 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
2f410 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
2f420 20 20 20 20 20 20 20 73 57 42 49 2e 6e 6f 74 52         sWBI.notR
2f430 65 61 64 79 20 3d 20 28 69 73 4f 70 74 69 6d 61  eady = (isOptima
2f440 6c 20 3f 20 6d 20 3a 20 73 57 42 49 2e 6e 6f 74  l ? m : sWBI.not
2f450 56 61 6c 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Valid);.        
2f460 69 66 28 20 73 57 42 49 2e 70 53 72 63 2d 3e 70  if( sWBI.pSrc->p
2f470 49 6e 64 65 78 3d 3d 30 20 29 20 6e 55 6e 63 6f  Index==0 ) nUnco
2f480 6e 73 74 72 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a  nstrained++;.  .
2f490 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
2f4a0 43 45 28 28 22 3d 3d 3d 20 74 72 79 69 6e 67 20  CE(("=== trying 
2f4b0 74 61 62 6c 65 20 25 64 20 77 69 74 68 20 69 73  table %d with is
2f4c0 4f 70 74 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e  Optimal=%d ===\n
2f4d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2f4e0 20 20 20 20 20 20 20 6a 2c 20 69 73 4f 70 74 69         j, isOpti
2f4f0 6d 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 61  mal));.        a
2f500 73 73 65 72 74 28 20 73 57 42 49 2e 70 53 72 63  ssert( sWBI.pSrc
2f510 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65  ->pTab );.#ifnde
2f520 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2f530 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
2f540 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
2f550 28 73 57 42 49 2e 70 53 72 63 2d 3e 70 54 61 62  (sWBI.pSrc->pTab
2f560 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
2f570 57 42 49 2e 70 70 49 64 78 49 6e 66 6f 20 3d 20  WBI.ppIdxInfo = 
2f580 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49  &pWInfo->a[j].pI
2f590 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  dxInfo;.        
2f5a0 20 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64    bestVirtualInd
2f5b0 65 78 28 26 73 57 42 49 29 3b 0a 20 20 20 20 20  ex(&sWBI);.     
2f5c0 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66     }else .#endif
2f5d0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2f5e0 20 20 20 20 20 62 65 73 74 42 74 72 65 65 49 6e       bestBtreeIn
2f5f0 64 65 78 28 26 73 57 42 49 29 3b 0a 20 20 20 20  dex(&sWBI);.    
2f600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2f610 73 65 72 74 28 20 69 73 4f 70 74 69 6d 61 6c 20  sert( isOptimal 
2f620 7c 7c 20 28 73 57 42 49 2e 63 6f 73 74 2e 75 73  || (sWBI.cost.us
2f630 65 64 26 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64  ed&sWBI.notValid
2f640 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20  )==0 );..       
2f650 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45   /* If an INDEXE
2f660 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 70  D BY clause is p
2f670 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
2f680 20 70 6c 61 6e 20 6d 75 73 74 20 75 73 65 20 74   plan must use t
2f690 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hat.        ** i
2f6a0 6e 64 65 78 20 69 66 20 69 74 20 75 73 65 73 20  ndex if it uses 
2f6b0 61 6e 79 20 69 6e 64 65 78 20 61 74 20 61 6c 6c  any index at all
2f6c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2f6d0 72 74 28 20 73 57 42 49 2e 70 53 72 63 2d 3e 70  rt( sWBI.pSrc->p
2f6e0 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20  Index==0 .      
2f6f0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2f700 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77  sWBI.cost.plan.w
2f710 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
2f720 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a  OT_FULLSCAN)==0.
2f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f740 20 20 7c 7c 20 73 57 42 49 2e 63 6f 73 74 2e 70    || sWBI.cost.p
2f750 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 73 57 42 49  lan.u.pIdx==sWBI
2f760 2e 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 3b  .pSrc->pIndex );
2f770 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ..        if( is
2f780 4f 70 74 69 6d 61 6c 20 26 26 20 28 73 57 42 49  Optimal && (sWBI
2f790 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  .cost.plan.wsFla
2f7a0 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
2f7b0 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20  ULLSCAN)==0 ){. 
2f7c0 20 20 20 20 20 20 20 20 20 6e 6f 74 49 6e 64 65           notInde
2f7d0 78 65 64 20 7c 3d 20 6d 3b 0a 20 20 20 20 20 20  xed |= m;.      
2f7e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2f7f0 43 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72  Conditions under
2f800 20 77 68 69 63 68 20 74 68 69 73 20 74 61 62 6c   which this tabl
2f810 65 20 62 65 63 6f 6d 65 73 20 74 68 65 20 62 65  e becomes the be
2f820 73 74 20 73 6f 20 66 61 72 3a 0a 20 20 20 20 20  st so far:.     
2f830 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2f840 20 20 20 28 31 29 20 54 68 65 20 74 61 62 6c 65     (1) The table
2f850 20 6d 75 73 74 20 6e 6f 74 20 64 65 70 65 6e 64   must not depend
2f860 20 6f 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73   on other tables
2f870 20 74 68 61 74 20 68 61 76 65 20 6e 6f 74 0a 20   that have not. 
2f880 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
2f890 79 65 74 20 72 75 6e 2e 20 20 28 49 6e 20 6f 74  yet run.  (In ot
2f8a0 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75  her words, it mu
2f8b0 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e  st not depend on
2f8c0 20 74 61 62 6c 65 73 0a 20 20 20 20 20 20 20 20   tables.        
2f8d0 2a 2a 20 20 20 20 20 20 20 69 6e 20 69 6e 6e 65  **       in inne
2f8e0 72 20 6c 6f 6f 70 73 2e 29 0a 20 20 20 20 20 20  r loops.).      
2f8f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2f900 20 20 28 32 29 20 41 20 66 75 6c 6c 2d 74 61 62    (2) A full-tab
2f910 6c 65 2d 73 63 61 6e 20 70 6c 61 6e 20 63 61 6e  le-scan plan can
2f920 6e 6f 74 20 73 75 70 65 72 63 65 64 65 20 69 6e  not supercede in
2f930 64 65 78 65 64 20 70 6c 61 6e 20 75 6e 6c 65 73  dexed plan unles
2f940 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  s.        **    
2f950 20 20 20 74 68 65 20 66 75 6c 6c 2d 74 61 62 6c     the full-tabl
2f960 65 2d 73 63 61 6e 20 69 73 20 61 6e 20 22 6f 70  e-scan is an "op
2f970 74 69 6d 61 6c 22 20 70 6c 61 6e 20 61 73 20 64  timal" plan as d
2f980 65 66 69 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  efined above..  
2f990 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2f9a0 20 2a 2a 20 20 20 28 33 29 20 41 6c 6c 20 74 61   **   (3) All ta
2f9b0 62 6c 65 73 20 68 61 76 65 20 61 6e 20 49 4e 44  bles have an IND
2f9c0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f  EXED BY clause o
2f9d0 72 20 74 68 69 73 20 74 61 62 6c 65 20 6c 61 63  r this table lac
2f9e0 6b 73 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ks an.        **
2f9f0 20 20 20 20 20 20 20 49 4e 44 45 58 45 44 20 42         INDEXED B
2fa00 59 20 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73  Y clause or this
2fa10 20 74 61 62 6c 65 20 75 73 65 73 20 74 68 65 20   table uses the 
2fa20 73 70 65 63 69 66 69 63 0a 20 20 20 20 20 20 20  specific.       
2fa30 20 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20   **       index 
2fa40 73 70 65 63 69 66 69 65 64 20 62 79 20 69 74 73  specified by its
2fa50 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2fa60 73 65 2e 20 20 54 68 69 73 20 72 75 6c 65 20 65  se.  This rule e
2fa70 6e 73 75 72 65 73 0a 20 20 20 20 20 20 20 20 2a  nsures.        *
2fa80 2a 20 20 20 20 20 20 20 74 68 61 74 20 61 20 62  *       that a b
2fa90 65 73 74 2d 73 6f 2d 66 61 72 20 69 73 20 61 6c  est-so-far is al
2faa0 77 61 79 73 20 73 65 6c 65 63 74 65 64 20 65 76  ways selected ev
2fab0 65 6e 20 69 66 20 61 6e 20 69 6d 70 6f 73 73 69  en if an impossi
2fac0 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ble.        **  
2fad0 20 20 20 20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e       combination
2fae0 20 6f 66 20 49 4e 44 45 58 45 44 20 42 59 20 63   of INDEXED BY c
2faf0 6c 61 75 73 65 73 20 61 72 65 20 67 69 76 65 6e  lauses are given
2fb00 2e 20 20 54 68 65 20 65 72 72 6f 72 0a 20 20 20  .  The error.   
2fb10 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 77 69       **       wi
2fb20 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64 20 61  ll be detected a
2fb30 6e 64 20 72 65 6c 61 79 65 64 20 62 61 63 6b 20  nd relayed back 
2fb40 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  to the applicati
2fb50 6f 6e 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20  on later..      
2fb60 20 20 2a 2a 20 20 20 20 20 20 20 54 68 65 20 4e    **       The N
2fb70 45 56 45 52 28 29 20 63 6f 6d 65 73 20 61 62 6f  EVER() comes abo
2fb80 75 74 20 62 65 63 61 75 73 65 20 72 75 6c 65 20  ut because rule 
2fb90 28 32 29 20 61 62 6f 76 65 20 70 72 65 76 65 6e  (2) above preven
2fba0 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ts.        **   
2fbb0 20 20 20 20 41 6e 20 69 6e 64 65 78 61 62 6c 65      An indexable
2fbc0 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e   full-table-scan
2fbd0 20 66 72 6f 6d 20 72 65 61 63 68 69 6e 67 20 72   from reaching r
2fbe0 75 6c 65 20 28 33 29 2e 0a 20 20 20 20 20 20 20  ule (3)..       
2fbf0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2fc00 20 28 34 29 20 54 68 65 20 70 6c 61 6e 20 63 6f   (4) The plan co
2fc10 73 74 20 6d 75 73 74 20 62 65 20 6c 6f 77 65 72  st must be lower
2fc20 20 74 68 61 6e 20 70 72 69 6f 72 20 70 6c 61 6e   than prior plan
2fc30 73 20 6f 72 20 65 6c 73 65 20 74 68 65 0a 20 20  s or else the.  
2fc40 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63        **       c
2fc50 6f 73 74 20 6d 75 73 74 20 62 65 20 74 68 65 20  ost must be the 
2fc60 73 61 6d 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  same and the num
2fc70 62 65 72 20 6f 66 20 72 6f 77 73 20 6d 75 73 74  ber of rows must
2fc80 20 62 65 20 6c 6f 77 65 72 2e 0a 20 20 20 20 20   be lower..     
2fc90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2fca0 28 20 28 73 57 42 49 2e 63 6f 73 74 2e 75 73 65  ( (sWBI.cost.use
2fcb0 64 26 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29  d&sWBI.notValid)
2fcc0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
2fcd0 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
2fce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2fcf0 28 62 65 73 74 4a 3c 30 20 7c 7c 20 28 6e 6f 74  (bestJ<0 || (not
2fd00 49 6e 64 65 78 65 64 26 6d 29 21 3d 30 20 20 20  Indexed&m)!=0   
2fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
2fd30 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2fd40 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2fd50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
2fd60 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20  T_FULLSCAN)==0. 
2fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2fd80 7c 20 28 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61  | (sWBI.cost.pla
2fd90 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2fda0 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21  E_NOT_FULLSCAN)!
2fdb0 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
2fdc0 26 26 20 28 6e 55 6e 63 6f 6e 73 74 72 61 69 6e  && (nUnconstrain
2fdd0 65 64 3d 3d 30 20 7c 7c 20 73 57 42 49 2e 70 53  ed==0 || sWBI.pS
2fde0 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 20 20  rc->pIndex==0   
2fdf0 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20       /* (3) */. 
2fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2fe10 7c 20 4e 45 56 45 52 28 28 73 57 42 49 2e 63 6f  | NEVER((sWBI.co
2fe20 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
2fe30 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
2fe40 53 43 41 4e 29 21 3d 30 29 29 0a 20 20 20 20 20  SCAN)!=0)).     
2fe50 20 20 20 20 20 20 20 26 26 20 28 62 65 73 74 4a         && (bestJ
2fe60 3c 30 20 7c 7c 20 73 57 42 49 2e 63 6f 73 74 2e  <0 || sWBI.cost.
2fe70 72 43 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72  rCost<bestPlan.r
2fe80 43 6f 73 74 20 20 20 20 20 20 20 20 2f 2a 20 28  Cost        /* (
2fe90 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  4) */.          
2fea0 20 20 20 20 20 20 7c 7c 20 28 73 57 42 49 2e 63        || (sWBI.c
2feb0 6f 73 74 2e 72 43 6f 73 74 3c 3d 62 65 73 74 50  ost.rCost<=bestP
2fec0 6c 61 6e 2e 72 43 6f 73 74 20 0a 20 20 20 20 20  lan.rCost .     
2fed0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
2fee0 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52  WBI.cost.plan.nR
2fef0 6f 77 3c 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  ow<bestPlan.plan
2ff00 2e 6e 52 6f 77 29 29 0a 20 20 20 20 20 20 20 20  .nRow)).        
2ff10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  ){.          WHE
2ff20 52 45 54 52 41 43 45 28 28 22 3d 3d 3d 20 74 61  RETRACE(("=== ta
2ff30 62 6c 65 20 25 64 20 69 73 20 62 65 73 74 20 73  ble %d is best s
2ff40 6f 20 66 61 72 22 0a 20 20 20 20 20 20 20 20 20  o far".         
2ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 77               " w
2ff60 69 74 68 20 63 6f 73 74 3d 25 2e 31 66 2c 20 6e  ith cost=%.1f, n
2ff70 52 6f 77 3d 25 2e 31 66 2c 20 6e 4f 42 53 61 74  Row=%.1f, nOBSat
2ff80 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c                j,
2ffa0 20 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f 73 74   sWBI.cost.rCost
2ffb0 2c 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e  , sWBI.cost.plan
2ffc0 2e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  .nRow,.         
2ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 57 42               sWB
2ffe0 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53  I.cost.plan.nOBS
2fff0 61 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  at));.          
30000 62 65 73 74 50 6c 61 6e 20 3d 20 73 57 42 49 2e  bestPlan = sWBI.
30010 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  cost;.          
30020 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20  bestJ = j;.     
30030 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
30040 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20   doNotReorder ) 
30050 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
30060 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
30070 20 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20   bestJ>=0 );.   
30080 20 61 73 73 65 72 74 28 20 73 57 42 49 2e 6e 6f   assert( sWBI.no
30090 74 56 61 6c 69 64 20 26 20 67 65 74 4d 61 73 6b  tValid & getMask
300a0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
300b0 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43  ist->a[bestJ].iC
300c0 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 57 48  ursor) );.    WH
300d0 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
300e0 70 74 69 6d 69 7a 65 72 20 73 65 6c 65 63 74 73  ptimizer selects
300f0 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f   table %d for lo
30100 6f 70 20 25 64 20 77 69 74 68 3a 5c 6e 22 0a 20  op %d with:\n". 
30110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
30120 20 20 20 20 63 6f 73 74 3d 25 2e 31 66 2c 20 6e      cost=%.1f, n
30130 52 6f 77 3d 25 2e 31 66 2c 20 6e 4f 42 53 61 74  Row=%.1f, nOBSat
30140 3d 25 64 20 77 73 46 6c 61 67 73 3d 30 78 25 30  =%d wsFlags=0x%0
30150 38 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  8x\n",.         
30160 20 20 20 20 20 20 20 62 65 73 74 4a 2c 20 70 4c         bestJ, pL
30170 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 2c 20  evel-pWInfo->a, 
30180 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 2c 20  bestPlan.rCost, 
30190 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52  bestPlan.plan.nR
301a0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
301b0 20 20 20 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61      bestPlan.pla
301c0 6e 2e 6e 4f 42 53 61 74 2c 20 62 65 73 74 50 6c  n.nOBSat, bestPl
301d0 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29  an.plan.wsFlags)
301e0 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73 74  );.    if( (best
301f0 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
30200 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
30210 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  Y)!=0 ){.      p
30220 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20  WInfo->nOBSat = 
30230 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
30240 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
30250 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
30260 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
30270 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20 20  STINCT)!=0 ){.  
30280 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
30290 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 30  fo->eDistinct==0
302a0 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   );.      pWInfo
302b0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
302c0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
302d0 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERED;.    }.    
302e0 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74  andFlags &= best
302f0 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
30300 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  s;.    pLevel->p
30310 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e 70  lan = bestPlan.p
30320 6c 61 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73  lan;.    testcas
30330 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  e( bestPlan.plan
30340 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
30350 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 20 20  _INDEXED );.    
30360 74 65 73 74 63 61 73 65 28 20 62 65 73 74 50 6c  testcase( bestPl
30370 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  an.plan.wsFlags 
30380 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
30390 45 58 20 29 3b 0a 20 20 20 20 69 66 28 20 62 65  EX );.    if( be
303a0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
303b0 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44  ags & (WHERE_IND
303c0 45 58 45 44 7c 57 48 45 52 45 5f 54 45 4d 50 5f  EXED|WHERE_TEMP_
303d0 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 20 20  INDEX) ){.      
303e0 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
303f0 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
30400 5f 4f 4e 4c 59 29 20 0a 20 20 20 20 20 20 20 26  _ONLY) .       &
30410 26 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  & (bestPlan.plan
30420 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
30430 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20  _TEMP_INDEX)==0 
30440 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
30450 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
30460 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  r = iIdxCur;.   
30470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30480 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
30490 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
304a0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
304b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
304c0 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d  vel->iIdxCur = -
304d0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 57 42  1;.    }.    sWB
304e0 49 2e 6e 6f 74 56 61 6c 69 64 20 26 3d 20 7e 67  I.notValid &= ~g
304f0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
30500 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
30510 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  tJ].iCursor);.  
30520 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
30530 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a 20 20 20  = (u8)bestJ;.   
30540 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c   if( bestPlan.pl
30550 61 6e 2e 6e 52 6f 77 3e 3d 28 64 6f 75 62 6c 65  an.nRow>=(double
30560 29 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  )1 ){.      pPar
30570 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2a  se->nQueryLoop *
30580 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  = bestPlan.plan.
30590 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  nRow;.    }..   
305a0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 69   /* Check that i
305b0 66 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e  f the table scan
305c0 6e 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ned by this loop
305d0 20 69 74 65 72 61 74 69 6f 6e 20 68 61 64 20 61   iteration had a
305e0 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45 58 45 44  n.    ** INDEXED
305f0 20 42 59 20 63 6c 61 75 73 65 20 61 74 74 61 63   BY clause attac
30600 68 65 64 20 74 6f 20 69 74 2c 20 74 68 61 74 20  hed to it, that 
30610 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
30620 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20  is being.    ** 
30630 75 73 65 64 20 66 6f 72 20 74 68 65 20 73 63 61  used for the sca
30640 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68 65 6e 20  n. If not, then 
30650 71 75 65 72 79 20 63 6f 6d 70 69 6c 61 74 69 6f  query compilatio
30660 6e 20 68 61 73 20 66 61 69 6c 65 64 2e 0a 20 20  n has failed..  
30670 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65    ** Return an e
30680 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
30690 20 70 49 64 78 20 3d 20 70 54 61 62 4c 69 73 74   pIdx = pTabList
306a0 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49 6e 64 65  ->a[bestJ].pInde
306b0 78 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  x;.    if( pIdx 
306c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 62 65  ){.      if( (be
306d0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
306e0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
306f0 58 45 44 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  XED)==0 ){.     
30700 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
30710 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
30720 6f 74 20 75 73 65 20 69 6e 64 65 78 3a 20 25 73  ot use index: %s
30730 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  ", pIdx->zName);
30740 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68  .        goto wh
30750 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
30760 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30770 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44      /* If an IND
30780 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 69  EXED BY clause i
30790 73 20 75 73 65 64 2c 20 74 68 65 20 62 65 73 74  s used, the best
307a0 49 6e 64 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Index() function
307b0 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 67   is.        ** g
307c0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 6e  uaranteed to fin
307d0 64 20 74 68 65 20 69 6e 64 65 78 20 73 70 65 63  d the index spec
307e0 69 66 69 65 64 20 69 6e 20 74 68 65 20 49 4e 44  ified in the IND
307f0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 0a 20  EXED BY clause. 
30800 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69 74 20         ** if it 
30810 66 69 6e 64 20 61 6e 20 69 6e 64 65 78 20 61 74  find an index at
30820 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20   all. */.       
30830 20 61 73 73 65 72 74 28 20 62 65 73 74 50 6c 61   assert( bestPla
30840 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70  n.plan.u.pIdx==p
30850 49 64 78 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Idx );.      }. 
30860 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45     }.  }.  WHERE
30870 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69  TRACE(("*** Opti
30880 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a  mizer Finished *
30890 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 70  **\n"));.  if( p
308a0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
308b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
308c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
308d0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
308e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f  ..  /* If the to
308f0 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73  tal query only s
30900 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20  elects a single 
30910 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52  row, then the OR
30920 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75  DER BY.  ** clau
30930 73 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74  se is irrelevant
30940 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e  ..  */.  if( (an
30950 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  dFlags & WHERE_U
30960 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70 4f 72  NIQUE)!=0 && pOr
30970 64 65 72 42 79 20 29 7b 0a 20 20 20 20 70 57 49  derBy ){.    pWI
30980 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f  nfo->nOBSat = pO
30990 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
309a0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
309b0 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44  caller is an UPD
309c0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
309d0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
309e0 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
309f0 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  to use a one-pas
30a00 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74  s algorithm, det
30a10 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69  ermine if this i
30a20 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
30a30 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73   ** The one-pass
30a40 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20   algorithm only 
30a50 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48 45  works if the WHE
30a60 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
30a70 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20 73  aints.  ** the s
30a80 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61  tatement to upda
30a90 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e  te a single row.
30aa0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
30ab0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
30ac0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
30ad0 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
30ae0 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
30af0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
30b00 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
30b10 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 26 26  S_DESIRED)!=0 &&
30b20 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45   (andFlags & WHE
30b30 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b  RE_UNIQUE)!=0 ){
30b40 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  .    pWInfo->okO
30b50 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20  nePass = 1;.    
30b60 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61  pWInfo->a[0].pla
30b70 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  n.wsFlags &= ~WH
30b80 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
30b90 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
30ba0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
30bb0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
30bc0 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
30bd0 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
30be0 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
30bf0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
30c00 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
30c10 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a  (pParse, -1); /*
30c20 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b   Insert the cook
30c30 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f  ie verifier Goto
30c40 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
30c50 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
30c60 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
30c70 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 66  = (double)1;.  f
30c80 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  or(ii=0, pLevel=
30c90 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54  pWInfo->a; ii<nT
30ca0 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c  abList; ii++, pL
30cb0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
30cc0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
30cd0 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
30ce0 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
30cf0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30d00 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
30d10 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
30d20 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ex */.    struct
30d30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
30d40 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54  TabItem;..    pT
30d50 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
30d60 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
30d70 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
30d80 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
30d90 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
30da0 62 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  bCur = pTabItem-
30db0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 57  >iCursor;.    pW
30dc0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d  Info->nRowOut *=
30dd0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52   pLevel->plan.nR
30de0 6f 77 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ow;.    iDb = sq
30df0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
30e00 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
30e10 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 28  hema);.    if( (
30e20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
30e30 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
30e40 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
30e50 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  ct ){.      /* D
30e60 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
30e70 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53   }else.#ifndef S
30e80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
30e90 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
30ea0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
30eb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
30ec0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
30ed0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
30ee0 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e  ar *pVTab = (con
30ef0 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
30f00 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
30f10 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Tab);.      int 
30f20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
30f30 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
30f40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30f50 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69  4(v, OP_VOpen, i
30f60 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62  Cur, 0, 0, pVTab
30f70 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
30f80 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
30f90 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
30fa0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
30fb0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
30fc0 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
30fd0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
30fe0 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
30ff0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
31000 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b   op = pWInfo->ok
31010 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65  OnePass ? OP_Ope
31020 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e  nWrite : OP_Open
31030 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69  Read;.      sqli
31040 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
31050 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
31060 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
31070 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65  b, op);.      te
31080 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43  stcase( pTab->nC
31090 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
310a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61     testcase( pTa
310b0 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
310c0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
310d0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
310e0 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29  pTab->nCol<BMS )
310f0 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
31100 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  k b = pTabItem->
31110 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20  colUsed;.       
31120 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
31130 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62      for(; b; b=b
31140 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  >>1, n++){}.    
31150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
31160 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74  hangeP4(v, sqlit
31170 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
31180 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20  r(v)-1, .       
31190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311a0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f       SQLITE_INT_
311b0 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e  TO_PTR(n), P4_IN
311c0 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  T32);.        as
311d0 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
311e0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Col );.      }. 
311f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31200 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
31210 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
31220 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
31230 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
31240 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31250 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
31260 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c  NDEX.    if( (pL
31270 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
31280 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
31290 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
312a0 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f     constructAuto
312b0 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73  maticIndex(pPars
312c0 65 2c 20 73 57 42 49 2e 70 57 43 2c 20 70 54 61  e, sWBI.pWC, pTa
312d0 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c  bItem, notReady,
312e0 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65   pLevel);.    }e
312f0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
31300 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
31310 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
31320 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
31330 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78        Index *pIx
31340 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
31350 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 4b 65  u.pIdx;.      Ke
31360 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71  yInfo *pKey = sq
31370 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
31380 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a  o(pParse, pIx);.
31390 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
313a0 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
313b0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73  dxCur;.      ass
313c0 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
313d0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
313e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
313f0 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29  ( iIndexCur>=0 )
31400 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
31410 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
31420 4f 70 65 6e 52 65 61 64 2c 20 69 49 6e 64 65 78  OpenRead, iIndex
31430 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
31440 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
31450 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
31460 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  ar*)pKey, P4_KEY
31470 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
31480 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
31490 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
314a0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
314b0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
314c0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
314d0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74  e, iDb);.    not
314e0 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
314f0 6b 28 73 57 42 49 2e 70 57 43 2d 3e 70 4d 61 73  k(sWBI.pWC->pMas
31500 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e  kSet, pTabItem->
31510 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  iCursor);.  }.  
31520 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
31530 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
31540 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
31550 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
31560 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
31570 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47  inError;..  /* G
31580 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
31590 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
315a0 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
315b0 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
315c0 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
315d0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
315e0 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
315f0 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
31600 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
31610 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
31620 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
31630 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62  or(ii=0; ii<nTab
31640 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  List; ii++){.   
31650 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
31660 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 65 78  o->a[ii];.    ex
31670 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61  plainOneScan(pPa
31680 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
31690 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65  Level, ii, pLeve
316a0 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46  l->iFrom, wctrlF
316b0 6c 61 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65  lags);.    notRe
316c0 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f  ady = codeOneLoo
316d0 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69  pStart(pWInfo, i
316e0 69 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e  i, wctrlFlags, n
316f0 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
31700 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
31710 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
31720 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  nt;.  }..#ifdef 
31730 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20  SQLITE_TEST  /* 
31740 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  For testing and 
31750 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
31760 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72  ly */.  /* Recor
31770 64 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70  d in the query p
31780 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lan information 
31790 61 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e  about the curren
317a0 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64  t table.  ** and
317b0 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
317c0 74 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66  to access it (if
317d0 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74   any).  If the t
317e0 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a  able itself.  **
317f0 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74   is not used, it
31800 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27  s name is just '
31810 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65  {}'.  If no inde
31820 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74  x is used.  ** t
31830 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74  he index is list
31840 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20  ed as "{}".  If 
31850 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
31860 69 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a  is used the.  **
31870 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27   index name is '
31880 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  *'..  */.  for(i
31890 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
318a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  ; ii++){.    cha
318b0 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  r *z;.    int n;
318c0 0a 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20  .    int w;.    
318d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
318e0 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a  tem *pTabItem;..
318f0 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
31900 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  Info->a[ii];.   
31910 20 77 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   w = pLevel->pla
31920 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  n.wsFlags;.    p
31930 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
31940 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
31950 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70  From];.    z = p
31960 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  TabItem->zAlias;
31970 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
31980 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  z = pTabItem->pT
31990 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  ab->zName;.    n
319a0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
319b0 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  30(z);.    if( n
319c0 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
319d0 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
319e0 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20  lan)-10 ){.     
319f0 20 69 66 28 20 28 77 20 26 20 57 48 45 52 45 5f   if( (w & WHERE_
31a00 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  IDX_ONLY)!=0 && 
31a10 28 77 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52  (w & WHERE_COVER
31a20 5f 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  _SCAN)==0 ){.   
31a30 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
31a40 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
31a50 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32  nQPlan], "{}", 2
31a60 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
31a70 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65  n += 2;.      }e
31a80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
31a90 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
31aa0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
31ab0 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   z, n);.        
31ac0 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20  nQPlan += n;.   
31ad0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
31ae0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
31af0 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  Plan++] = ' ';. 
31b00 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
31b10 65 28 20 77 20 26 20 57 48 45 52 45 5f 52 4f 57  e( w & WHERE_ROW
31b20 49 44 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73  ID_EQ );.    tes
31b30 74 63 61 73 65 28 20 77 20 26 20 57 48 45 52 45  tcase( w & WHERE
31b40 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a  _ROWID_RANGE );.
31b50 20 20 20 20 69 66 28 20 77 20 26 20 28 57 48 45      if( w & (WHE
31b60 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
31b70 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
31b80 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
31b90 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
31ba0 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22  an[nQPlan], "* "
31bb0 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  , 2);.      nQPl
31bc0 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  an += 2;.    }el
31bd0 73 65 20 69 66 28 20 28 77 20 26 20 57 48 45 52  se if( (w & WHER
31be0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26  E_INDEXED)!=0 &&
31bf0 20 28 77 20 26 20 57 48 45 52 45 5f 43 4f 56 45   (w & WHERE_COVE
31c00 52 5f 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20  R_SCAN)==0 ){.  
31c10 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
31c20 74 72 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e  trlen30(pLevel->
31c30 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
31c40 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
31c50 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
31c60 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
31c70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  lan)-2 ){.      
31c80 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
31c90 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
31ca0 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c  lan], pLevel->pl
31cb0 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
31cc0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
31cd0 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
31ce0 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
31cf0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20  _plan[nQPlan++] 
31d00 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = ' ';.      }. 
31d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31d20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
31d30 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
31d40 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20  n], "{} ", 3);. 
31d50 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33       nQPlan += 3
31d60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  ;.    }.  }.  wh
31d70 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
31d80 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
31d90 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
31da0 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
31db0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
31dc0 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
31dd0 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
31de0 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
31df0 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
31e00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31e10 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
31e20 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
31e30 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
31e40 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
31e50 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
31e60 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
31e70 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
31e80 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
31e90 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
31ea0 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  /.  return pWInf
31eb0 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
31ec0 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
31ed0 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
31ee0 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49  Error:.  if( pWI
31ef0 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73  nfo ){.    pPars
31f00 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
31f10 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
31f20 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  eryLoop;.    whe
31f30 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
31f40 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  WInfo);.  }.  re
31f50 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
31f60 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e   Generate the en
31f70 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  d of the WHERE l
31f80 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e  oop.  See commen
31f90 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ts on .** sqlite
31fa0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f  3WhereBegin() fo
31fb0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
31fc0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  ormation..*/.voi
31fd0 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
31fe0 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
31ff0 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  nfo){.  Parse *p
32000 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
32010 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a  pParse;.  Vdbe *
32020 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
32030 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
32040 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
32050 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
32060 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
32070 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
32080 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
32090 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
320a0 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
320b0 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
320c0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
320d0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
320e0 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f  ;.  for(i=pWInfo
320f0 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30  ->nLevel-1; i>=0
32100 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76  ; i--){.    pLev
32110 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
32120 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  i];.    sqlite3V
32130 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
32140 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43  v, pLevel->addrC
32150 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ont);.    if( pL
32160 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f  evel->op!=OP_Noo
32170 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
32180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32190 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76  pLevel->op, pLev
321a0 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
321b0 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p2);.      sqlit
321c0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
321d0 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20  , pLevel->p5);. 
321e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
321f0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
32200 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
32210 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  E && pLevel->u.i
32220 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  n.nIn>0 ){.     
32230 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
32240 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  pIn;.      int j
32250 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
32260 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
32270 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e  v, pLevel->addrN
32280 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  xt);.      for(j
32290 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  =pLevel->u.in.nI
322a0 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e  n, pIn=&pLevel->
322b0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31  u.in.aInLoop[j-1
322c0 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e  ]; j>0; j--, pIn
322d0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  --){.        sql
322e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
322f0 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
32300 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  op+1);.        s
32310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
32320 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e  (v, OP_Next, pIn
32330 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64  ->iCur, pIn->add
32340 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20  rInTop);.       
32350 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
32360 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
32370 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
32380 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
32390 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
323a0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
323b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
323c0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
323d0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
323e0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28  ddrBrk);.    if(
323f0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
32400 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
32410 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
32420 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
32430 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
32440 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
32450 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65  oin);.      asse
32460 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  rt( (pLevel->pla
32470 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
32480 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
32490 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c            || (pL
324a0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
324b0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
324c0 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)!=0 );.      
324d0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
324e0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
324f0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
32500 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32510 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
32520 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
32530 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
32540 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
32550 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49    if( pLevel->iI
32560 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20  dxCur>=0 ){.    
32570 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32580 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
32590 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
325a0 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
325b0 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
325c0 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
325d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
325e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
325f0 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
32600 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
32610 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
32620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
32630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
32640 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
32650 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
32660 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
32670 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
32680 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
32690 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
326a0 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74  he "break" point
326b0 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70   is here, just p
326c0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
326d0 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20  he outer loop.. 
326e0 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f   ** Set it..  */
326f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
32700 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57  solveLabel(v, pW
32710 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a  Info->iBreak);..
32720 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
32730 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
32740 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
32750 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
32760 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  gin..  */.  asse
32770 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
32780 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d  el==1 || pWInfo-
32790 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73  >nLevel==pTabLis
327a0 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72  t->nSrc );.  for
327b0 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
327c0 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f  nfo->a; i<pWInfo
327d0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70  ->nLevel; i++, p
327e0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e  Level++){.    In
327f0 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20  dex *pIdx = 0;. 
32800 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
32810 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
32820 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
32830 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
32840 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
32850 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
32860 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
32870 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
32880 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
32890 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
328a0 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62  ==0.     && pTab
328b0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20  ->pSelect==0.   
328c0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
328d0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
328e0 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
328f0 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
32900 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 65 76 65    int ws = pLeve
32910 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b  l->plan.wsFlags;
32920 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e  .      if( !pWIn
32930 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
32940 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58   (ws & WHERE_IDX
32950 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
32960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
32970 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
32980 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
32990 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
329a0 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20        if( (ws & 
329b0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
329c0 30 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45  0 && (ws & WHERE
329d0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20  _TEMP_INDEX)==0 
329e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
329f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
32a00 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
32a10 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
32a20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
32a30 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75  * If this scan u
32a40 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61  ses an index, ma
32a50 6b 65 20 63 6f 64 65 20 73 75 62 73 74 69 74 75  ke code substitu
32a60 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61  tions to read da
32a70 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ta.    ** from t
32a80 68 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66  he index in pref
32a90 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61  erence to the ta
32aa0 62 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20  ble. Sometimes, 
32ab0 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  this means.    *
32ac0 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64  * the table need
32ad0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 66   never be read f
32ae0 72 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70  rom. This is a p
32af0 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
32b00 2c 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20  ,.    ** as the 
32b10 76 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73  vdbe level waits
32b20 20 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65   until the table
32b30 20 69 73 20 72 65 61 64 20 62 65 66 6f 72 65 20   is read before 
32b40 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
32b50 73 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c  seeking the tabl
32b60 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
32b70 72 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e  record correspon
32b80 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72  ding to the curr
32b90 65 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74  ent.    ** posit
32ba0 69 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ion in the index
32bb0 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
32bc0 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f   Calls to the co
32bd0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20  de generator in 
32be0 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57  between sqlite3W
32bf0 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20  hereBegin and.  
32c00 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72    ** sqlite3Wher
32c10 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63  eEnd will have c
32c20 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74  reated code that
32c30 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20   references the 
32c40 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72  table.    ** dir
32c50 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f  ectly.  This loo
32c60 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74  p scans all that
32c70 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f   code looking fo
32c80 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a  r opcodes.    **
32c90 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
32ca0 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  the table and co
32cb0 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f  nverts them into
32cc0 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20   opcodes that.  
32cd0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74    ** reference t
32ce0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  he index..    */
32cf0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
32d00 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
32d10 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
32d20 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
32d30 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
32d40 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  x;.    }else if(
32d50 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
32d60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
32d70 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  LTI_OR ){.      
32d80 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIdx = pLevel->u
32d90 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a  .pCovidx;.    }.
32da0 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20      if( pIdx && 
32db0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
32dc0 64 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c  d){.      int k,
32dd0 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20   j, last;.      
32de0 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
32df0 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
32e00 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57  3VdbeGetOp(v, pW
32e10 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20  Info->iTop);.   
32e20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
32e30 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
32e40 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  (v);.      for(k
32e50 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b  =pWInfo->iTop; k
32e60 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
32e70 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
32e80 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
32e90 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
32ea0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
32eb0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
32ec0 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
32ed0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
32ee0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  pIdx->nColumn; j
32ef0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
32f00 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49   if( pOp->p2==pI
32f10 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
32f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
32f30 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20   pOp->p2 = j;.  
32f40 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
32f50 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
32f60 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
32f70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32f80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32f90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32fa0 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d  assert( (pLevel-
32fb0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
32fc0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
32fd0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
32fe0 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f    || j<pIdx->nCo
32ff0 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
33000 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
33010 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
33020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
33030 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
33040 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
33050 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
33060 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
33070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33080 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
33090 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
330a0 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  /.  pParse->nQue
330b0 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
330c0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
330d0 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  ;.  whereInfoFre
330e0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
330f0 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.